Quelle est la meilleure façon d'obtenir des interfaces utilisateur textuelles (ncurses-like) en Java?
J'ai besoin d'implémenter une application console (éventuellement en Java) avec des fonctionnalités de type ncurses (telles que naviguer dans un menu et redessiner tout l'écran).
Les seules solutions que je peux trouver pour le faire jusqu'à présent sont CHARVA ("Une boîte à outils de fenêtrage Java pour les terminaux de texte" ), tuipeer ( "Une Interface utilisateur de texte pour le Java AWT" ) et un très vieux article de Dr. Dobb ( " une interface utilisateur de texte pour le Java AWT ").
JUSQU'à présent, CHARVA est la meilleure chose que je puisse trouver mais je n'aime pas l'idée d'utiliser JNI pour envelopper les malédictions.
Existe-t-il un moyen standard, par exemple avec AWT / Swing,de le faire? Quelles sont les autres alternatives?
7 réponses
Depuis 2010, il y a Lanterna:
Lanterna est une bibliothèque Java vous permettant d'écrire des interfaces utilisateur semi-graphiques faciles dans un environnement texte uniquement, très similaire à la bibliothèque C curses mais avec plus de fonctionnalités. Lanterna prend en charge les terminaux compatibles xterm et les émulateurs de terminaux tels que Konsole, gnome-terminal, putty, xterm et bien d'autres. L'un des principaux avantages de lanterna est qu'il ne dépend d'aucune bibliothèque native mais fonctionne à 100% en pure Java.
Plus de détails ici: https://github.com/mabe02/lanterna
Vous pouvez aller voter pour cette question ici: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6351276
Essentiellement, il n'y a pas de bon moyen d'obtenir des fonctionnalités de type ncurses sans JNI jusqu'à ce que ce problème soit résolu.
Je crois que Jcurses est une implémentation java native de l'API curses, je me souviens qu'il a quelques bizarreries, mais il devrait être capable de faire ce que vous voulez:
Essayez Java malédictions (désolé, il utilise JNI). J'ai également essayé d'implémenter une version courte de cette bibliothèque juste pour apprendre JNI , voir http://plindenbaum.blogspot.com/2008/01/java-native-interface-jni-notebook.html . on pourrait aussi imaginer un JPanel spécialisé affichant une matrice de caractères:
public class TPanel extends JPanel
{
private Vector<Vector<YourCharAndStyle>> rows;
protected void paintComponent(Graphics g)
{
//paint the characters
(...)
}
}
La réponse courte est de traiter un wrapper Java autour des malédictions.
La réponse longue:
Les terminaux varient beaucoup, c'est pourquoi les bibliothèques terminfo/termcap existent et pourquoi elles sont un gâchis à gérer (les responsables de ces projets sont saints btw). Ils abstraient toutes les variations terminales vraiment basiques à quelque chose de sain d'esprit. Les malédictions rendent ceux dans de belles bibliothèques efficaces à utiliser.
Si vous voulez une solution Java pure, vous aurez besoin de ces deux bibliothèques ou de leur équivalent dans Java. Je suis sûr que quelqu'un vous indiquera cela s'il existe, mais pour autant que je sache, il n'existe pas.
J'utilise JavaTUI ( http://sourceforge.net/projects/javatui/files/) dans Mes plusieurs projets java de console. C'est mieux ce que je peux trouver mais c'est loin d'être parfait. Je pense qu'il n'y a pas une bonne implémentation TUI dans le monde java.
Je pense qu'il serait préférable d'abstraire votre code Java du TUI et d'utiliser ncurses contre plusieurs parties séparées de votre application ou en utilisant des arguments, dans un style web-services. Par exemple, codez votre TUI et lorsque l'utilisateur appelle une action, utilisez ncurses pour appeler votre code en passant certains paramètres
java -Daction=doSomething MyApp
De cette façon, vous pouvez coder votre application en utilisant une interface graphique également au cas où vous en auriez besoin.