Какой лучший способ получить функциональность текстового пользовательского интерфейса (подобную ncurses) в Java?

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

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

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

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


person Anthony    schedule 24.08.2009    source источник
comment
Я изучал это пару лет назад и не нашел больше, чем вы. Я подозреваю, что проблема в том, что функциональность терминала низкого уровня сильно зависит от платформы - и не только на уровне ОС, но и на уровне эмулятора терминала (VT100, xterm и т. Д.). Я не уверен, как бы я справился с этим, не обертывая собственный API, такой как curses (или, по крайней мере, termcap / terminfo), который уже абстрагирует его. Я полагаю, вы могли бы передать System.out необработанные управляющие символы.   -  person David Moles    schedule 24.08.2009
comment
Передача необработанных управляющих символов в стандартный вывод - это именно то, как это делает curses, так что это разумная идея, хотя и существенная часть работы.   -  person skaffman    schedule 24.08.2009
comment
Что не так с JNI? Я бы пошел с CHARVA, это выглядит завершенным (иш).   -  person    schedule 25.08.2009
comment
Я бы порекомендовал пойти с CHARVA. В библиотеке ncurses много чего происходит. Он не только поддерживает множество различных типов терминалов, но и обрабатывает множество случаев, когда конкретная версия эмулятора содержит ошибки. Единственные разумные способы получить поддержку терминала, эквивалентную ncurses, - это обернуть ncurses, как это делает CHARVA, или перенести ncurses на Java. Последнее было бы здорово, если бы кто-то поддержал его в будущем.   -  person Devon_C_Miller    schedule 28.08.2009


Ответы (8)


С 2010 года в компании Lanterna:

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

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

person Waldemar Wosiński    schedule 18.12.2012
comment
Выглядит отлично. Я не работаю в компании, где мне это было нужно, но теперь я знаю на будущее :) Спасибо. - person Anthony; 25.03.2013

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

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

person stinkymatt    schedule 30.08.2009

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

https://github.com/klamonte/jexer

person Yousha Aleayoub    schedule 18.11.2018

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

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

person Community    schedule 24.08.2009
comment
похоже, что он также использует JNI - person skaffman; 24.08.2009
comment
Однако он не обновлялся семь лет ... Кажется, он также использует некоторый собственный код, вероятно, с использованием JNI. - person E Dominique; 24.08.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
 (...)
 }

}
person Pierre    schedule 24.08.2009

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

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

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

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

person D'Nabre    schedule 27.08.2009

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

person Alexey Sviridov    schedule 28.08.2009

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

java -Daction=doSomething MyApp

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

person Eldelshell    schedule 28.08.2009