Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Порядок обработки событий в текстовом поле. Разница keyReleased или keyTyped 
V
    Опции темы
Saboteur
Дата 5.10.2011, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 16.8.2007
Где: Минск

Репутация: нет
Всего: нет



Приветствую всех!
Столкнулся со странным багом - хочу разобраться в механизме происходящего.
Есть NumField наследник jTextField, в него вводятся единицы измерения в футах, рядом есть простой label в который выводятся эти же данные уже в метрах.
На поле вешается слушатель:

Код

edtHeightFeet.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyTyped(KeyEvent e) {

                /* ... some code ... */

            /* build alternate measure string */
              updateAlternateDisplay(); //тут обновляется label 
            }
        });


баг состоял в том что отображение в label всегда опаздывало на 1 действие. Пример:
нажимается кнопка "1" на label выводится 0
ещё раз нажимается кнопка "1" (в NumField число 11), на label 30 см. и т.п.

Если же заменить keyTyped на keyReleased всё работает синхронно.

После долгого ковыряния я пришел к следующему выводу:
Когда мы нажимаем на кнопку (курсор находится внутри eNumField, на котором висит слушатель  keyPressed или keyTyped) генерируется событие, внутри вызывается метод обновляющий надпись (отображение футов в метры), когда этот метод запускается он берёт значение из eNumField и это значение - старое! т.е. кнопка уже нажата, keyPressed отработал,а новое значение в ячейку ещё не попало => надпись отображается неверно.
В случае с keyReleased значение в eNumField успевает изменится. А значит надпись изменится правильно.
Проблема в том что всё вышенаписанное мои рассуждения и  я не нашел детального описания механизма в Оракловской документации. Это просто то поведение которое я наблюдаю в данном случае.

Где можно почитать про этоповедение. Кроме оракловской документации
 smile 


Это сообщение отредактировал(а) Saboteur - 5.10.2011, 16:20
PM MAIL ICQ   Вверх
COVD
Дата 6.10.2011, 03:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 4
Всего: 43



Цитата

Проблема в том что всё вышенаписанное мои рассуждения и  я не нашел детального описания механизма в Оракловской документации. Это просто то поведение которое я наблюдаю в данном случае.

Еще одно подтверждение, что практика - критерий истины. Не все описано в документации. Или для того, чтобы понять, что скрывается за словами, нужен эксперимент. Это обычное дело.
PM MAIL   Вверх
Saboteur
Дата 6.10.2011, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 16.8.2007
Где: Минск

Репутация: нет
Всего: нет



В итоге всё было переписал с помощью ChangeListener.  smile 

Вдохновился примерои кода вот отсюда.
Код

// Listen for changes in the text
myTextField.getDocument().addDocumentListener(new DocumentListener() {
  public void changedUpdate(DocumentEvent e) {
    warn();
  }
  public void removeUpdate(DocumentEvent e) {
    warn();
  }
  public void insertUpdate(DocumentEvent e) {
    warn();
  }

  public void warn() {
     if (Integer.parseInt(textField.getText())<=0){
       JOptionPane.showMessageDialog(null,
          "Error: Please enter number bigger than 0", "Error Massage",
          JOptionPane.ERROR_MESSAGE);
     }
  }
});


Попутно удалось удалить полкласса legathy-кода. PROFIT!  smile 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0680 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.