我正在编写一个应用程序,要求我从控制台读取密钥,而不必等待用户按Enter键。我已经读过JCurses库可以提供帮助。
我尝试使用Toolkit.readCharacter()
这样:
InputChar c = Toolkit.readCharacter();
system.out.println(c.getCharacter());
但问题是,无论您输入多少个字符,readCharacter()
方法都不会结束执行。即使你按回车键,它似乎还在等着你输入一个角色。
我非常感谢使用JCurses的任何帮助,或任何其他方式。
答案 0 :(得分:0)
Java Curses有一些特定的击键识别方法,但是将自己绑定到外部库以获得单个功能可能不是最好的解决方案。
您可以通过创建终端式Swing应用程序并使用KeyListener
来检测击键事件来实现您的目标。然而,MadProgrammer在How to make esc stop a method中指出,这样的解决方案可能存在“焦点问题”。
因此,如果您想要跟踪特定的击键,或者想要根据不同的用户输入影响程序行为,我建议使用key bindings作为Swing的一部分实现。
e.g。
component.getInputMap(WHEN_IN_FOCUSED_WINDOW).put
(KeyStroke.getKeyStroke("F1"),"actionName");
component.getActionMap().put("actionName", yourAction);
组件是任何JComponent
对象(可能是终端显示),yourAction
是任何Swing操作。使用此处所示的getInputMap()
的参数化形式对于“控制台”应用程序是优选的,因为用户必须在顶级窗口内进行击键,因此组件焦点无关紧要。
答案 1 :(得分:0)
这个程序对我有用。
您需要调用 Toolkit.init() 将终端置于cbreak()模式。
请记得在退出之前调用 Toolkit.shutdown() 。
有几个缺点。
该计划。
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();
}
}