2010-09-03 3 views
3

Я пытаюсь узнать что-то о графическом интерфейсе, используя NetBeans6.8, начиная с раздела GUI в уроке java.Событие KeyPressed

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

Итак, я надел как текстовые поля одно событие 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); 
    } 
}); 

ответ

1

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

Вам нужно приложить свой код в блок catch try.

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

Integer.parseInt() принимает строку и возвращает int ... Вы имели в виду, если она не получает «числовую строку»? – antonyt

+1

Я настоятельно рекомендую использовать NumberFormatException вместо глобального Exception и распечатать трассировку стека. Тем не менее это не решает проблему, только скрывает его. –

+0

@Vash, Больше не могу согласиться, просто вскочил в быстрое решение. Я отредактировал решение для соответствия;) @antonyt, "3" = 3, "63" = 63, "0" = 0, "a" = ERROR, "" = ERROR. – JonWillis

0

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

1

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

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

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

0

Существует простое упражнение для конвертера Celsius-Фаренгейт

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

Смежные вопросы