我需要让我的程序从键盘输入数字,但需要允许输入多位数字。
我的听众看起来像这样:
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);或类似的东西会导致我的听众停止工作。有没有比设置计时器和检查每半秒更容易的方法呢?
答案 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);