2个或更多数字输入的击键之间的延迟

时间:2011-09-14 14:55:33

标签: java swing listener delay

我需要让我的程序从键盘输入数字,但需要允许输入多位数字。

我的听众看起来像这样:

class.getRootPane().getInputMap(JRootPane.WHEN_IN_FOCUSED_WINDOW).put(
    KeyStroke.getKeyStroke(49,0, false), "one");
class.getRootPane().getActionMap().put("one", new AbstractAction() {

    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("1 pressed");
    }
});
            //2
class.getRootPane().getInputMap(JRootPane.WHEN_IN_FOCUSED_WINDOW).put(
    KeyStroke.getKeyStroke(50,0, false), "two");
class.getRootPane().getActionMap().put("two", new AbstractAction() {

    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("2 pressed");
    }
});

我建议存储一个全局整数,如果清除会导致类似的行为:

if (numberfield.isEmpty()){

    number = 1;

    wait for half a second

    if wait is over commit number to function and clear numberfield
}//resulting in "1"

else if (numberfield.isnotEmpty()){
    "you must have caught it in time"
    numberfield = "numberfield"+"1";

    wait for half a second

    if wait is over commit number to function and clear numberfield
}//resulting in "11" if 1 was pressed twice

我的问题是:实现这种“延迟”的最佳方法是什么?我担心Thread.sleep(500);或类似的东西会导致我的听众停止工作。有没有比设置计时器和检查每半秒更容易的方法呢?

2 个答案:

答案 0 :(得分:1)

根据发布的代码,我不确定你在做什么。您正在尝试使用根窗格,这表示您的GUI上没有任何可聚焦组件。

最简单的解决方案是在每个文本字段中添加DocumentListener。每当生成DocumentEvent时,您都可以启动/重新启动Timer。如果Timer触发,则提交该号码并清除该字段。

如果您对GUI上的所有文本字段执行此操作,则可能更容易查看Global Event Listeners。您应该可以使用KeyEventPostProcessor。每次生成KeyEvent时,都要重新启动Timer。如果Timer触发,则提交该号码并清除该字段。

答案 1 :(得分:-1)

我认为最好只使用听众:

KeyListener l = new KeyListener() {
    long lastPress = System.currentTimeMillis();
    public void keyPressed(KeyEvent e) {
        if (e.getKeyChar() == '0' || e.getKeyChar() == '1' || e.getKeyChar() == '2' || e.getKeyChar() == '3' || ..........(keys you want)...) {
            if (System.currentTimeMillis() - lastPress >= delay) {
                lastPress = System.currentTimeMillis();
                yourInputString += e.getKeyChar();
            }
        }
    }
}

addKeyListener(l);

然后获取正在使用的号码int number = Integer.intValue(yourInputString);