在Java中实现文本用户界面(类似于ncurses的)的功能,最好的方式是什么?

26

我需要实现一个控制台应用程序(可能是Java),具有类似于ncurses的功能(例如导航菜单和重新绘制整个屏幕)。

到目前为止,我能找到的唯一解决方案是CHARVA("一个Java文本终端窗口工具包"),tuipeer("Java AWT的文本用户界面")和一个非常古老的Dr. Dobb's文章("A Text UI for the Java AWT")。

到目前为止,CHARVA是我能找到的最好的东西,但我不喜欢它使用JNI来包装curses的想法。

是否有任何标准方法,比如使用AWT / Swing来做到这一点?还有其他选择吗?


我几年前研究过这个问题,但并没有比你更多的发现。我怀疑问题在于低级终端功能高度依赖于特定平台,不仅仅是操作系统层面,还包括终端仿真器层面(VT100、xterm等)。我甚至不确定如何处理这个问题,除非使用像curses(或termcap / terminfo至少)这样的本地API进行封装,已经将其抽象化了。我想你可以通过System.out来发送原始控制字符。 - David Moles
将原始控制字符输出到stdout正是curses的实现方式,因此这是一个明智的想法,尽管需要花费相当大的功夫。 - skaffman
2
JNI有什么问题?我会选择CHARVA,它看起来很完整(差不多)。 - user9903
我建议使用CHARVA。在ncurses库中有很多内容。它不仅支持许多不同的终端类型,还处理特定版本仿真器出现故障的情况。获取类似于ncurses的终端支持的唯一明智方法是像CHARVA一样包装ncurses,或将ncurses移植到Java。如果有人能够支持后者,那将是很酷的事情。 - Devon_C_Miller
8个回答

31

自2010年以来,有Lanterna:

Lanterna是一个Java库,允许您在纯文本环境中编写易于使用的半图形用户界面,非常类似于C库curses,但具有更多功能。 Lanterna支持xterm兼容终端和终端仿真器,如konsole,gnome-terminal,putty,xterm等。 Lanterna的主要好处之一是它不依赖于任何本地库,而是完全在Java中运行。

更多信息请参见:https://github.com/mabe02/lanterna


1
看起来很不错。虽然我现在不在需要它的公司工作,但是以后有用的时候我会知道 :) 谢谢。 - Anthony

10

3

2
短答案是使用一个Java封装的curses库来解决问题。
长答案是: 终端差异很大,这就是为什么terminfo/termcap库存在并且处理起来很麻烦的原因(顺便说一句,那些项目的维护者真是伟大的人)。它们将所有真正基本的终端变化抽象成了什么东西。Curses将其转换为易于使用的高效库。
如果您想要一个纯Java的解决方案,您需要使用这两个库或它们在Java中的等价物。如果有的话,我相信有人会指引您去找,但据我所知,这样的库不存在。

2

1

1

我认为最好将您的Java代码与TUI分离,并针对应用程序的几个独立部分或使用参数以Web服务的方式使用ncurses。例如,编写您的TUI代码,当用户调用操作时,使用ncurses调用您的代码并传递一些参数。

java -Daction=doSomething MyApp

这样你就可以使用GUI编写应用程序,以防需要。


1

看起来似乎也使用了JNI。 - skaffman
虽然它已经七年没有更新了... 它似乎也使用了一些本地代码,可能是使用JNI。 - E Dominique

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接