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?

22
demandé sur Joachim Sauer 2009-08-24 13:20:00

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

26
répondu Waldemar Wosiński 2015-08-16 07:18:43

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.

9
répondu stinkymatt 2009-08-30 06:19:42

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:

Http://sourceforge.net/projects/javacurses/

1
répondu 2009-08-24 10:09:30

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
 (...)
 }

}
1
répondu Pierre 2009-08-24 15:36:50

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.

1
répondu D'Nabre 2009-08-27 23:28:03

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.

1
répondu Alexey Sviridov 2009-08-28 02:47:36

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.

1
répondu Eldelshell 2009-08-28 15:27:35