tbe*_*not 9 java swing nullpointerexception java-8
我已经将Swing应用程序迁移到Java 8,最近我们看到了以下NPE异常.
java.lang.NullPointerException
at java.awt.EventQueue.getCurrentEventImpl(EventQueue.java:848)
at java.awt.EventQueue.getCurrentEvent(EventQueue.java:842)
at java.awt.Component.requestFocusHelper(Component.java:7628)
at java.awt.Component.requestFocusHelper(Component.java:7620)
at java.awt.Component.requestFocus(Component.java:7495)
at javax.swing.JComponent.requestFocus(JComponent.java:1504)
at javax.swing.plaf.basic.BasicPopupMenuUI$MenuKeyboardHelper.stateChanged(BasicPopupMenuUI.java:1173)
at javax.swing.MenuSelectionManager.fireStateChanged(MenuSelectionManager.java:202)
at javax.swing.MenuSelectionManager.setSelectedPath(MenuSelectionManager.java:129)
at javax.swing.JPopupMenu.setVisible(JPopupMenu.java:784)
at javax.swing.JPopupMenu.show(JPopupMenu.java:965)
at org.tbee.swing.StandardComponentPopupMenu.showJTableMenu(StandardComponentPopupMenu.java:555)
at org.tbee.swing.StandardComponentPopupMenu$2.run(StandardComponentPopupMenu.java:175)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
Run Code Online (Sandbox Code Playgroud)
迁移回J7是一个问题,因为正在使用lambda,所以我不能轻易确认这确实是J8问题.但是这个代码已经运行了好几年了,在Java 5,6和7中幸存下来.所以很有可能是J8特有的.
异常的原因是未设置EventQueue中的currentEvent.这是通过其setCurrentEventAndMostRecentTimeImpl(AWTEvent e)完成的.但是,如果我在堆栈中追溯,我会在EventQueue:756(Java 1.8.0u45)中看到,在完全调用该方法之后完成调度.
if (event instanceof ActiveEvent) {
// This could become the sole method of dispatching in time.
setCurrentEventAndMostRecentTimeImpl(event);
((ActiveEvent)event).dispatch();
Run Code Online (Sandbox Code Playgroud)
我在黑暗中为什么该变量为null.调试几乎是不可能的,因为该段代码处理了所有事件.
是否有人知道Swing在J8中的事件处理的变化?
最后,弹出菜单的打开必须重新安排在 EDT 上,即使打开它的代码正在 EDT 上运行。
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
jpopupMenu.show(c, x, y);
}
});
Run Code Online (Sandbox Code Playgroud)
仅当在 J8 上运行时。