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