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

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

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

Пока что CHARVA - лучшая вещь, которую я могу найти, но мне не нравится идея использовать JNI для обертывания проклятий.

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

Ответы [ 8 ]

26 голосов
/ 18 декабря 2012

С 2010 года есть Лантерна:

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

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

10 голосов
/ 30 августа 2009

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

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

1 голос
/ 28 августа 2009

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

java -Daction=doSomething MyApp

Таким образом, вы можете кодировать свое приложение, используя графический интерфейс, даже в случае необходимости.

1 голос
/ 28 августа 2009

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

1 голос
/ 28 августа 2009

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

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

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

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

1 голос
/ 24 августа 2009

Попробуйте java curses (извините, он использует 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
 (...)
 }

}
1 голос
/ 24 августа 2009

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

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

0 голосов
/ 18 ноября 2018

Вы можете попробовать Jexer - текстовый пользовательский интерфейс Java:

https://github.com/klamonte/jexer

...