Каков наилучший способ получить функциональность текстовых пользовательских интерфейсов (ncurses-like) в Java?

Мне нужно реализовать консольное приложение (возможно, на Java) с функциональностью, подобной ncurses (например, навигация по меню и перерисовка всего экрана).

единственными решениями, которые я могу найти, чтобы сделать это до сих пор являются CHARVA ( "Java Windowing Toolkit для текстовых терминалов"), tuipeer ( "текстовый пользовательский интерфейс для Java AWT") и очень старая статья доктора Добба ( " текстовый интерфейс для Java AWT ").

до сих пор ЧАРВА лучшее, что я могу найти, но мне не нравится идея использовать JNI для обертывания проклятий.

есть ли стандартный способ, скажем, с AWT / Swing, сделать это? Какие еще существуют альтернативы?

7 ответов


с 2010 года существует Lanterna:

Lanterna-это библиотека Java, позволяющая писать простые полуграфические пользовательские интерфейсы в текстовой среде, очень похожей на проклятия библиотеки C, но с большей функциональностью. Lanterna поддерживает xterm совместимые терминалы и эмуляторы терминалов, такие как konsole, gnome-terminal, putty, xterm и многие другие. Одним из основных преимуществ lanterna является то, что он не зависит от какой-либо родной библиотеки, но работает на 100% в чистом виде Ява.

подробнее здесь: https://github.com/mabe02/lanterna


вы можете пойти голосовать за этот вопрос здесь:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6351276

по сути, нет хорошего способа получить функциональность ncurses-like без JNI, пока эта проблема не будет решена.


Я считаю, что Jcurses-это родная реализация java API curses, я помню, что у нее есть несколько причуд, но она должна быть в состоянии делать то, что вы хотите:

http://sourceforge.net/projects/javacurses/


попробовать java ругается (извините, что он использует JNI). Я также попытался реализовать короткую версию этой библиотеки, чтобы узнать JNI, см. http://plindenbaum.blogspot.com/2008/01/java-native-interface-jni-notebook.html. Можно также представить специализированную JPanel, отображающую матрицу символов:

public class TPanel extends JPanel
{
private Vector<Vector<YourCharAndStyle>> rows;

protected void paintComponent(Graphics g)
 {
 //paint the characters
 (...)
 }

}

короткий ответ-это сделка с Java-оболочкой вокруг проклятий.

длинный ответ:

терминалы сильно различаются, поэтому библиотеки terminfo/termcap существуют и поэтому с ними приходится иметь дело (сопровождающие этих проектов-Святые кстати). Они абстрагируют все действительно основные терминальные вариации к чему-то нормальному. Проклятия делают их в хороших эффективных библиотеках для использования.

Если вы хотите чистое решение Java, вам понадобятся обе эти библиотеки или их эквивалент в Java. Я уверен, что кто-нибудь укажет вам на это, если оно существует, но я, насколько мне известно, его не существует.


Я использую JavaTUI (http://sourceforge.net/projects/javatui/files/) в моих нескольких консольных проектах java. Это лучшее, что я могу найти, но это далеко не идеально. Я думаю, что в мире java нет хорошей имплеметации TUI.


Я думаю, что было бы лучше абстрагировать ваш Java-код от TUI и использовать ncurses против нескольких отдельных частей вашего приложения или использовать аргументы в стиле веб-сервисов. Например, Закодируйте свой TUI, и когда пользователь вызывает действие, используйте ncurses для вызова кода, передающего некоторые параметры

java -Daction=doSomething MyApp

таким образом, вы можете кодировать свое приложение с помощью GUI также в случае необходимости.