我正在编写一个应用程序,它要求我从控制台读取密钥,而不必等待用户按enter键。我读到过JCurses库可以提供帮助。
我尝试这样使用Toolkit.readCharacter():
InputChar c = Toolkit.readCharacter();
system.out.println(c.getCharacter());但问题是,无论您输入多少个字符,readCharacter()方法都不会结束执行。即使您按enter键,它似乎仍在等待您输入一个字符。
我真的很感谢使用JCurses的任何帮助,或者任何其他方式都可以。
发布于 2013-06-21 13:31:43
Java Curses有几种特定的击键识别方法,但是将自己绑定到一个外部库来实现单个函数可能不是最好的解决方案。
可以通过创建终端风格的Swing应用程序并使用KeyListener来检测击键事件来实现您的目标。然而,MadProgrammer在How to make esc stop a method中指出,这样的解决方案可能会有“焦点问题”。
因此,如果您希望跟踪特定的击键,或者希望根据不同的用户输入影响程序行为,我建议您使用key bindings,它是作为Swing的一部分实现的。
例如:
component.getInputMap(WHEN_IN_FOCUSED_WINDOW).put
(KeyStroke.getKeyStroke("F1"),"actionName");
component.getActionMap().put("actionName", yourAction);其中,component是任何JComponent对象(假设是终端显示),而yourAction是任何Swing动作。对于“控制台”应用程序,最好使用这里所示的参数化形式的getInputMap(),因为用户必须在顶层窗口中进行击键,因此组件焦点是无关紧要的。
发布于 2017-06-10 23:07:14
这个程序对我很有效。
您需要调用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();
}
}https://stackoverflow.com/questions/8378530
复制相似问题