Действие JButton вызвало событие focusLost. Как это возможно?

Один из наших клиентов сообщил об исключении в нашем приложении. Проблема в том, что я совершенно не могу понять, как можно воспроизвести эту ошибку.

Вот код:

btn.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        popup.show(btn, 3, btn.getHeight());
    }
});

Примечания:

  • btn - конечная локальная переменная типа JButton .
  • popup - конечная локальная переменная типа JPopupMenu .

Возникло следующее исключение:

java.awt.IllegalComponentStateException: component must be showing on the screen to determine its location
    at java.awt.Component.getLocationOnScreen_NoTreeLock(Unknown Source)
    at java.awt.Component.getLocationOnScreen(Unknown Source)
    at javax.swing.JPopupMenu.show(Unknown Source)
    at fr.def.iss.vd2.mod_site_watcher_gui.SiteElementPanel$4.actionPerformed(SiteElementPanel.java:117)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.focusLost(Unknown Source)
    at java.awt.Component.processFocusEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.KeyboardFocusManager.redispatchEvent(Unknown Source)
    at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown Source)
    at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$000(Unknown Source)
    at java.awt.EventQueue$1.run(Unknown Source)
    at java.awt.EventQueue$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$2.run(Unknown Source)
    at java.awt.EventQueue$2.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

Насколько я понимаю, метод show жалуется, что btn не отображается. Как это возможно, что btn не отображается, когда вызывается его метод actionPerformed ?

Самым странным в этой трассировке стека является то, что метод actionPerformed срабатывает, пока FocusEvent (на самом деле focusLost ).

Вопрос в том, можете ли вы объяснить, как может происходить эта трассировка стека?

Эпилог

Спасибо на предложение trashgod, я нашел проблему.

В Windows: , когда кнопка исчезает во время ее нажатия, запускаются ее ActionListeners , как если бы кнопка была нажата. Такое поведение наблюдается в Windows, но не в Linux.

Я зарегистрировал ошибку в базе данных ошибок Oracle / Sun. вот ссылка:

http://bugs.sun.com/bugdatabase/view_bug.do? bug_id = 7115421

(эта ссылка станет действительной в течение нескольких дней после проверки командой Java).

Спасибо за вашу помощь. Ответы trashgod и Thomas очень помогли.

5
задан barjak 24 November 2011 в 14:17
поделиться