我已经将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)迁移回J7是一个问题,因为使用的是lambda,所以我很难确定这确实是一个J8问题。但是这些代码已经运行了好几年了,还存在于Java5、6和7中,所以它很可能是特定于J8的。
异常的原因是没有设置EventQueue中的EventQueue。这是由其setCurrentEventAndMostRecentTimeImpl(AWTEvent e)完成的。但是,如果我在堆栈中追溯,我会发现在EventQueue:756 (Java1.8.0u45)中,调度是在调用该方法之后完成的。
if (event instanceof ActiveEvent) {
// This could become the sole method of dispatching in time.
setCurrentEventAndMostRecentTimeImpl(event);
((ActiveEvent)event).dispatch();我不知道为什么变量是空的。调试几乎是不可能的,因为所有事件都是由该代码处理的。
有人知道J8中Swing事件处理的变化吗?
发布于 2015-04-17 05:29:41
最后,弹出式菜单的打开必须重新安排在EDT上,即使它正在EDT上运行的代码打开。
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
jpopupMenu.show(c, x, y);
}
});仅当在J8上运行时。
发布于 2015-04-20 22:13:19
此外,请确保如果您正在安装备用事件队列,则在它自己的事件上执行此操作,例如:
Swingutilities.invokeLater(){
... run() {
..do event queue push();
}
}问题是,事件队列推送没有迁移当前事件,只迁移挂起的事件。
发布于 2017-06-08 02:30:42
下面的工作很好:
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Toolkit.getDefaultToolkit().getSystemEventQueue().push(Customized Event);
}
});https://stackoverflow.com/questions/29650874
复制相似问题