Java 如何使用JLine编写等效的KeyListener?

Java 如何使用JLine编写等效的KeyListener?,java,console,jline,Java,Console,Jline,我正在开发一个用Java编写的控制台应用程序。我要做的是处理用户键盘输入。当在终端中使用我们的程序启动一个长进程时,用户必须能够随时按'q'停止该进程(该进程在单独的线程上运行) 我试过几种方法: 在另一个不同的线程中运行读取用户输入并向进程的线程抛出InterruptedException 使用JLine及其控制台阅读器 使用JLine并添加一个链接到键盘键的TriggeredAction 但是每次,我都面临着同样的问题:用户必须按[code>ENTER键,我不想这样 如果你有任何想法或我

我正在开发一个用Java编写的控制台应用程序。我要做的是处理用户键盘输入。当在终端中使用我们的程序启动一个长进程时,用户必须能够随时按
'q'
停止该进程(该进程在单独的线程上运行)

我试过几种方法:

  • 在另一个不同的线程中运行读取用户输入并向进程的线程抛出
    InterruptedException
  • 使用JLine及其
    控制台阅读器
  • 使用JLine并添加一个链接到键盘键的
    TriggeredAction
但是每次,我都面临着同样的问题:用户必须按[code>ENTER键,我不想这样

如果你有任何想法或我的问题的实际解决方案,谢谢你的帮助


PS:如果你认为这是不可能的,请不要回答。我知道这是可能的。

也许你可以使用其中一个库

对于linux

窗户

与你的问题不太相关,但我认为可以帮助你


所有这一切的问题是,您将失去平台独立性。

为了避免用户按enter键并能够直接响应按键,我们可以通过以下方式使用,其中我们首先将终端更改为rawmode以直接响应按键,然后等待下一个输入的字符

var-terminal=TerminalBuilder.terminal()
terminal.enterawmode()
var reader=terminal.reader()
var c=reader.read()

org.jline
杰琳
3.12.3

JLine是否已经具备这种能力,并且与平台无关?使用JLine,您可以在ConsoleReader中使用void addTriggeredAction(char c,ActionListener listener)方法。来自addTriggeredAction JavaDoc:如果某个字符通过了预处理,添加一个触发的操作可以给出另一个操作过程。如果用户输入q,则表示您希望关闭应用程序。addTriggerAction('q',new ActionListener(){System.exit(0);});可以做到:JLine不是100%纯Java。在Windows上,它依赖.dll文件来初始化终端,使其能够接受无缓冲输入。但是,不需要安装:初始化后,JLine将动态地将DLL提取到临时目录并加载它。有关更多详细信息,请参阅jline.WindowsTerminal类的文档。在UNIX系统(包括Macintosh OS X)上,JLine将执行stty命令来初始化终端,以允许无缓冲输入。有关更多详细信息,请参阅jline.UnixTerminal类的文档。正如我在问题中所说,我试图添加一个
TriggeredAction
,但它不起作用。你试过了吗?是的,我试过了。这对我来说很好。我正在使用JLine的1.0版。我正在使用下一个代码
getConsoleReader().addTriggeredAction('q',new ActionListener(){@Override public void actionPerformed(ActionEvent e){System.out.println(“>>>已执行”);System.exit(0);})