我需要实现一个具有类似 ncurses 功能(例如导航菜单和重绘整个屏幕)的控制台应用程序(可能用 Java 编写)。
到目前为止,我能找到的唯一解决方案是 CHARVA(“用于文本终端的 Java 窗口工具包”)、tuipeer(“用于 Java AWT 的文本用户界面”)和一个非常老的 Dr. Dobb 的文章(“Java AWT 的文本 UI “)。
到目前为止,CHARVA 是我能找到的最好的东西,但我不喜欢它使用 JNI 来包装诅咒的想法。
是否有任何标准方法(例如使用 AWT/Swing)来执行此操作?还有什么其他选择?
自 2010 年起就有 Lanterna :
Lanterna 是一个 Java 库,允许您在纯文本环境中编写简单的半图形用户界面,与 C 库curses 非常相似,但具有更多功能。 Lanterna 支持 xterm 兼容终端和终端仿真器,例如 konsole、gnome-terminal、putty、xterm 等。 Lanterna 的主要优点之一是它不依赖于任何本机库,而是 100% 在纯 Java 中运行。
您可能想在这里为这个问题投票:https://bugs.java.com/bugdatabase/view_bug?bug_id=6351276
在这个问题得到解决之前,基本上没有什么好方法可以在没有 JNI 的情况下获得类似 ncurses 的功能。
简短的答案是处理诅咒的 Java 包装器。
长答案:
终端差异很大,这就是 terminfo/termcap 库存在的原因以及它们处理起来很混乱的原因(顺便说一句,这些项目的维护者都是圣人)。他们将所有真正基本的终端变化抽象为理智的东西。 Curses 使这些库可以在高效的库中使用。
如果您想要一个纯 Java 解决方案,您将需要这两个库或 Java 中的等效库。我确信如果它存在的话会有人指出这一点,但据我所知它不存在。
我在我的几个控制台 java 项目中使用 JavaTUI (http://sourceforge.net/projects/javatui/files/)。这是我能找到的最好的,但它远非完美。我认为在java世界中没有一个好的TUI实现。
我相信Jcurses是curses API的原生java实现,我记得它有一些怪癖,但它应该能够做你想做的事:
尝试 javacurses(抱歉它使用了 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
(...)
}
}
我认为最好从 TUI 中抽象出 Java 代码,并以 Web 服务风格对应用程序的几个独立部分使用 ncurses 或使用参数。例如,编写您的 TUI,当用户调用操作时,使用 ncurses 来调用您的代码并传递一些参数
java -Daction=doSomething MyApp
这样,您也可以在需要时使用 GUI 来编写应用程序。