JCurses
Bon c'est archaïque diront certain, je dirais plutot que c'est révolutionnaire et super pratique (geek inside) mais les interface en mode console, les ncurses like j'adore ...
Donc dans le cadre d'un projet d'administration qui ne peut se faire qu'en mode console, j'ai décidé de tester les possibilité de JCurses ... J'ai pas non plus mis des heures parce que je n'ai pas que ça a faire mais ça m'a l'air très prometteur ...
Voici l'adresse du site ou on peut le télécharge. Simplement comme vous pouvez rapidement le constater, il n'y a pas beaucoup d'exemple et en guise de doc, on n'a qu'une java doc (qui est bien foutue je dois avouer !)
En vous expliquant comme j'ai fait, je vais imposer une manière de faire, c'est sans doute pas la meilleur alors mettez de la distance et trouver votre propre chemin =)
Deux petites choses : le .jar et le .so doivent être accéssible par Java et dans le même répertoire !! N'essayez pas de lancer tout ceci dans Eclipse, ça ne fonctionnera pas ... d'abord une petite erreur qui peut être corrigée en ajoutant la variable TERM=xterm a l'environnement, mais on y voit rien, le terminal d'Eclipse n'interprète pas le ncurses !!!
Dans un premier temps, je voulais que tout ai l'apparance d'un AS400 (I5 comme on dit maintenant) pour coller a des interface que les utilisateurs connaissent déja ! J'ai donc fait une classe qui permet de faire l'équivalent d'une feuille de style pour le projet :
public final class I5Styles { public static final CharColor normal = new CharColor(CharColor.BLACK, CharColor.GREEN); public static final CharColor revert = new CharColor(CharColor.GREEN, CharColor.BLACK); public static void styleObject(Object obj) { if (obj instanceof Window) { Window w = (Window)obj; w.setTitleColors(normal); w.setBorderColors(normal); w.getRootPanel().setColors(normal); w.getRootPanel().setPanelColors(normal); } else if (obj instanceof BorderPanel) { BorderPanel p = (BorderPanel)obj; p.setColors(normal); p.setPanelColors(normal); p.setBorderColors(normal); } else if (obj instanceof Button) { Button b = (Button)obj; b.setColors(normal); b.setFocusedButtonColors(revert); } else if (obj instanceof Label) { Label l = (Label)obj; l.setColors(normal); } else if (obj instanceof TextArea) { TextArea t = (TextArea)obj; t.setColors(normal); t.setBorderColors(normal); t.setCursorColors(revert); t.setScrollbarColors(revert); t.setTextComponentColors(normal); } else if (obj instanceof TextField) { TextField t = (TextField)obj; t.setColors(normal); t.setDelimiterColors(normal); t.setCursorColors(revert); t.setTextComponentColors(normal); } } public static void styleObjects(Object[] objs) { for (int i = 0; i < objs.length; i++) { styleObject(objs[i]); } } }
Voila assez simple a utiliser ... on prend un Widget et hop I5Styles.styleComponent(monWidget); !
Ensuite ma première page :
public class StartWindow extends Window implements ActionListener { public StartWindow() { super(Toolkit.getScreenWidth(), Toolkit.getScreenHeight(), true, "MyFirstApplication"); setShadow(false); /*- Text label -*/ Label label = new Label("This application enables you to export or to validate exports\nbetween the three environments."); /*- Buttons -*/ Button export = new Button("Export"); Button validate = new Button("Validate"); /*- Listeners -*/ export.addListener(this); validate.addListener(this); /*- Panels -*/ Panel rootPanel = getRootPanel(); BorderPanel buttonPanel = new BorderPanel(Toolkit.getScreenWidth(), 5); /*- Styles -*/ I5Styles.styleObjects(new Object[] {this, buttonPanel, label, export, validate}); /*- Layout managers -*/ BorderLayoutManager rootLayoutManager = new BorderLayoutManager(); BorderLayoutManager buttonLayoutManager = new BorderLayoutManager(); rootPanel.setLayoutManager(rootLayoutManager); buttonPanel.setLayoutManager(buttonLayoutManager); /*- Packing -*/ rootLayoutManager.addWidget(label, BorderLayoutManager.CENTER, WidgetsConstants.ALIGNMENT_CENTER, WidgetsConstants.ALIGNMENT_CENTER); buttonLayoutManager.addWidget(export, BorderLayoutManager.WEST, WidgetsConstants.ALIGNMENT_CENTER, WidgetsConstants.ALIGNMENT_CENTER); buttonLayoutManager.addWidget(validate, BorderLayoutManager.EAST, WidgetsConstants.ALIGNMENT_CENTER, WidgetsConstants.ALIGNMENT_CENTER); rootLayoutManager.addWidget(buttonPanel, BorderLayoutManager.SOUTH, WidgetsConstants.ALIGNMENT_BOTTOM, WidgetsConstants.ALIGNMENT_CENTER); } public void actionPerformed(ActionEvent event) { if (event.getSource() instanceof Button) { Button button = (Button) event.getSource(); if (button.getLabel().startsWith("Validate")) { System.out.println("Validate"); } else { System.out.println("Export"); } } } }
Voila ... Ensuite pour démarrer le tout on lance comme ceci :
public class JCursesTest { public static void main(String[] args) { /*- Main window -*/ StartWindow startWindow = new StartWindow(); try { startWindow.show(); Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } finally { startWindow.close(); } } }
Bon pour ne pas vous influencer d'avantage, je vais vous laisser choisir la méthode avec laquelle vous allez gérer les évennements et tout... Je suis moi même en train de chercher une manière optimale, et elle va sans doute changer alors je ne la met pas ici ... juste un petit ScreenShot :

