无需使用JCurses按“输入”即可从键盘读取

时间:2011-12-04 20:57:19

标签: java io console character jcurses

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

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

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

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

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

2 个答案:

答案 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()

有几个缺点。

  • 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();
    }
}