Запутанный порядок событий в Java Swing Thread - PullRequest
2 голосов
/ 20 июля 2010

у меня есть панель, которая содержит текстовое поле для ввода номера и кнопку отправки, иногда новое (обновленное) значение не может быть отправлено, когда я нажимаю кнопку (отправляется предыдущее значение поля)

в режиме отладки я вижу, что иногда

AbstractButton.fireActionPerformed ()

вызывается (который получает значение поля в это время и затем передает)поток диспетчеризации событий до

JFormattedTextFiled.FocusLostHandler

и

JFormattedTextField.commitEdit()

(который обновляет значение поля).

я думаю, что событие jbutton никогда не должно вызываться дотекстовое поле теряет фокус и обновляет свое значение

есть идеи по поводу проблемы?

Я использую xp-sp2 и java 1.6.0_06-b02

Ответы [ 5 ]

0 голосов
/ 29 марта 2011

Насколько я знаю, Java не дает никаких гарантий относительно порядка событий (кто-то, пожалуйста, исправьте меня, если я ошибаюсь!).В любом случае проблемы с событием focusLost кажутся нормальными.Естественно, мы ожидаем, что он будет обработан до того, как фокус фактически сместится и будут инициированы события для нового элемента управления.Это не тот случай.

Как видно из сообщения на острове Каталина, решение заключается в использовании invokeLater.Код для вашей кнопки «отправить» должен выглядеть примерно так:

protected void buttonClick() {
  Runnable doStuff = new Runnable() {
    public void run() {
      // Do whatever button processing is needed here
    }
  };

  // Invoke later, so that any LostFocus event will have been processed first
  SwingUtilities.invokeLater(doListSelection);
}

Если у вас есть много элементов управления, которые выполняют некоторую обработку, и много элементов управления, которые могут потерять фокус, похоже, что нет" решение.Откровенно говоря, это слабость в Swing: он должен гарантировать логический порядок событий при смене фокуса.

0 голосов
/ 10 декабря 2010

Когда я пишу обработчик событий, который делает что-то со значением другого компонента, я ссылаюсь на него напрямую.Если ваш обработчик LostFocus должен работать до того, как содержимое станет действительным, и если мы не можем гарантировать, что он будет работать до начала действия кнопки, возможно, было бы неплохо переместить код, содержащийся вобработчик LostFocus в частный метод, к которому может обращаться этот обработчик и действие кнопки, так что он может выполнять всю работу сам.Когда в конечном итоге срабатывает «LostFocus», он будет выполнен снова, но это не должно иметь значения.

0 голосов
/ 21 июля 2010

спасибо за ответы, ребята, и извините, что я запускаю тот же therad на форуме Java (я не знал правил):

во всяком случае, на самом деле меня интересует причина проблемы, а не ее решение В EventQueue

есть два случая

вот события для случая 1:

MouseEvent (MOUSE_RELEASED)
MouseEvent (MOUSE_CLICKED)
InvocationEvent
InvocationEvent
InvocationEvent
CausedFocusEvent (FOCUS_LOST; opposite: JButton; source: FormattedNumberField)
CausedFocusEvent (FOCUS_GAINED; opposite: FormattedNumberField; source: JButton)
InvocationEvent
MouseEvent (MOUSE_MOVED)
MouseEvent (MOUSE_EXITED)

и вот события для случая 2:

CausedFocusEvent (FOCUS_LOST; opposite: JButton; source: FormattedNumberField)
CausedFocusEvent (FOCUS_GAINED; opposite: FormattedNumberField; source: JButton)
InvocationEvent
InvocationEvent
...
MouseEvent (MOUSE_RELEASED)
MouseEvent (MOUSE_CLICKED)
InvocationEvent
InvocationEvent
...
MouseEvent (MOUSE_MOVED)
MouseEvent (MOUSE_EXITED)

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

0 голосов
/ 21 июля 2010

Я почти уверен, что EventQueue поддерживает последовательность действий, но я видел, как отладчик изменял порядок кажущийся , когда я забывал использовать invokeLater() из другого нить.

0 голосов
/ 20 июля 2010

Извините, я перечитал ваш вопрос - я неправильно понял его ранее.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...