Событие KeyPressed - PullRequest
       7

Событие KeyPressed

3 голосов
/ 03 сентября 2010

Я пытаюсь что-то узнать о GUI, используя NetBeans6.8, начиная с раздела GUI в руководстве по Java.

Существует простое упражнение для конвертора Цельсия-Фаренгейта. Я хочу, чтобы было два TextFields, одно для Цельсия и одно для температуры по Фаренгейту; если пользователь печатает в текстовом поле по Цельсию, он получает результат, «напечатанный» в текстовом поле по Фаренгейту. и наоборот.

Итак, я поместил в оба текстовых поля одно событие KeyTyped, вот код:

private void celsiusTextKeyTyped(java.awt.event.KeyEvent evt) {                                
    int cels = Integer.parseInt(celsiusText.getText());
    int fahr = (int)(cels * 1.8 + 32);
    fahrText.setText(fahr + ""); 
}                                    

private void fahrTextKeyTyped(java.awt.event.KeyEvent evt) {                                
    int fahr = Integer.parseInt(fahrText.getText());
    int cels = (int)(fahr / 1.8 - 32);
    celsiusText.setText(cels + ""); 
}

Это не работает. Если я что-то наберу в текстовом поле, я получу это исключение: java.lang.NumberFormatException: For input string: ""

Код, который прикрепляет слушателей:

celsiusText.addKeyListener(new java.awt.event.KeyAdapter() {
    public void keyTyped(java.awt.event.KeyEvent evt) {
        celsiusTextKeyTyped(evt);
    }
});

fahrText.addKeyListener(new java.awt.event.KeyAdapter() {
    public void keyTyped(java.awt.event.KeyEvent evt) {
        fahrTextKeyTyped(evt);
    }
});

[Однако я не могу изменить его, он автоматически генерируется.]

Ответы [ 4 ]

1 голос
/ 03 сентября 2010

Я подозреваю, что произошло то, что вы добавили эти обработчики с чем-то вроде celsiusText.addKeyListener, да?

Дело в том, что это даст вам не только KEY_TYPED события, которые вы хотели, но иKEY_DOWN и KEY_UP.Событие KEY_DOWN произойдет до того, как текст действительно будет введен в поле, поэтому ваш код запускает это поле как пустое поле.Попытка преобразовать пустую строку в число приводит к исключению формата.

Самый простой способ исправить это - конструкция try / catch, которую публикуют другие люди.

1 голос
/ 03 сентября 2010

Метод .getText () возвращает строку, а не число, если эта строка содержит нечисловые символы (т. Е. Буква, пробел, вообще ничего), тогда parseInt сгенерирует исключение NumberFormatException.Поскольку вы используете KeyEvent, как только вы нажимаете «7», событие запускается до того, как 7 вводится в текстовое поле.Таким образом, текстовое поле все еще содержит только «», откуда и происходит ошибка.Вы можете также прослушать событие keyUp .

Вам необходимо заключить код в блок try catch.

private void fahrTextKeyTyped(java.awt.event.KeyEvent evt)
{   
    try
    {                             
        int fahr = Integer.parseInt(fahrText.getText());
        int cels = (int)(fahr / 1.8 - 32);
        celsiusText.setText(cels + "");
    }
    catch(NumberFormatException ex)
    {
        //Error handling code here, i.e. informative message to the user
    }
}

Альтернативой может быть то, что вы могли быотфильтровать не-числа по событию keydown, см. пример здесь - http://www.javacoffeebreak.com/java107/java107.html (Создание пользовательского компонента - NumberTextField)

0 голосов
/ 03 сентября 2010

Существует простое упражнение для Преобразователь Цельсия-Фаренгейта

Это действительно старый пример. Лучше всего использовать DocumentListener, а не KeyListener.

0 голосов
/ 03 сентября 2010

Возможно, вы установили действие на keyDown, это означает, что это происходит даже до того, как значение ключа «добавлено» в текстовое поле, а вы извлекаете значение из него, все еще пустое "".

...