2

我正在编写一个应用程序,该应用程序需要我从控制台读取密钥,而无需等待用户按 Enter。我读过 JCurses 库可以提供帮助。

我试过Toolkit.readCharacter()这样使用:

InputChar c = Toolkit.readCharacter();
system.out.println(c.getCharacter());

但问题是,readCharacter()无论您输入多少字符,该方法都不会结束执行。即使你按下回车,它似乎仍然在等待你输入一个字符。

我非常感谢使用 JCurses 或任何其他方式的任何帮助。

4

2 回答 2

0

Java Curses 有几个特定的​​击键识别方法,但是将自己绑定到单个函数的外部库可能不是最好的解决方案。

你所追求的可以通过创建一个终端风格的 Swing 应用程序来实现,并使用 aKeyListener来检测击键事件。但是,MadProgrammer 在How to make esc stop a method中指出,这种解决方案可能存在“焦点问题”。

因此,如果您想跟踪特定的击键,或者想根据不同的用户输入影响程序行为,我建议您使用作为 Swing 的一部分实现的键绑定。

例如

component.getInputMap(WHEN_IN_FOCUSED_WINDOW).put
    (KeyStroke.getKeyStroke("F1"),"actionName");
component.getActionMap().put("actionName", yourAction);

其中 component 是任何JComponent对象(可能是终端显示器),并且yourAction是任何 Swing 动作。使用此处所示的参数化形式getInputMap()对于“控制台”应用程序来说是更可取的,因为用户必须在顶层窗口中进行击键,因此组件焦点是无关紧要的。

于 2013-06-21T05:31:42.607 回答
0

这个程序对我有用。
您需要调用Toolkit.init()将终端置于 cbreak() 模式。并且记得在退出之前调用Toolkit.shutdown() 。

有几个缺点。

  • jcurses 自动将 tty 置于 cbreak 模式,并且 jcurses 不提供直接操作 curses 库的方法。
  • 进入 jcurses 后,输出处于 cbreak 模式,来自 java 的直接字符串有换行符,但没有回车符。
  • jcurses的开发者只实现了拥有整个屏幕的curses部分。如果你想要的只是 cbreak 模式,jcurses 似乎有点过头了。

该程序。

import jcurses.system.CharColor;
import jcurses.system.InputChar;
import jcurses.system.Toolkit;

public class itest 
{

    public static void main(String[] args) 
    {
        int y = 0;
        CharColor color = new CharColor(CharColor.BLACK, CharColor.WHITE);
        Toolkit.init();
        while (true) {
            InputChar c = Toolkit.readCharacter();
            if ('q' == c.getCharacter())
                break;
            Toolkit.printString(String.format("c : %c", c.getCharacter()), 0, y++, color);
        }
        Toolkit.shutdown();
    }
}
于 2017-06-10T15:07:13.907 回答