Один из наших клиентов сообщил об исключении в нашем приложении. Проблема в том, что я совершенно не могу понять, как этот баг может быть воспроизведен.
Вот код:
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 и Томаса очень помогли.
setVisible
) JButton никогда не изменяется 4)actionPerformed
никогда не вызывается явно моим кодом 5) экземпляр JButton добавляется в контейнер, но на него нигде больше не ссылаются. Также нет кода, который пытается получить доступ к JButton через его контейнер. - person barjak   schedule 22.11.2011ActionListener
, но мы не знаем, что еще вы делаете со своей кнопкой. Нам нужно увидеть этот код, если мы хотим вам помочь, а фрагмента кода, который вы разместили, недостаточно для того, чтобы мы могли найти проблему. Если проблему нельзя воспроизвести, если просто добавить ту же кнопку в пустой фрейм, то проблема кроется где-то еще в вашем коде. - person Laf   schedule 22.11.2011