Задержка между нажатиями клавиш для ввода двух или более цифр - PullRequest
0 голосов
/ 14 сентября 2011

Мне нужно, чтобы моя программа принимала цифры с клавиатуры, но нужно разрешить ввод чисел из нескольких цифр.

Мои слушатели выглядят так:

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.сна (500);или что-то подобное заставило бы моих слушателей перестать работать.Есть ли более простой способ сделать это, чем установка таймера и проверка каждые полсекунды?

Ответы [ 2 ]

1 голос
/ 14 сентября 2011

Я не уверен, что вы делаете, основываясь на опубликованном коде. Вы пытаетесь использовать корневую панель, которая указывает на то, что в вашем графическом интерфейсе нет компонентов для фокусировки.

Самое простое решение - добавить DocumentListener в каждое текстовое поле. Когда генерируется DocumentEvent, вы запускаете / перезапускаете таймер. Если таймер срабатывает, вы фиксируете номер и очищаете поле.

Если вы делаете это для всех текстовых полей в графическом интерфейсе, возможно, будет проще проверить Global Event Listeners . Вы должны быть в состоянии использовать KeyEventPostProcessor. Каждый раз, когда генерируется KeyEvent, вы перезапускаете таймер. Если таймер срабатывает, вы фиксируете номер и очищаете поле.

0 голосов
/ 14 сентября 2011

Я думаю, что было бы лучше просто использовать слушателя:

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);

...