首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NullPointerException at java.awt.EventQueue.getCurrentEventImpl

NullPointerException at java.awt.EventQueue.getCurrentEventImpl
EN

Stack Overflow用户
提问于 2015-04-15 12:57:11
回答 3查看 1.6K关注 0票数 11

我已经将Swing应用程序迁移到Java 8,最近我们看到了以下NPE异常。

代码语言:javascript
复制
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)中,调度是在调用该方法之后完成的。

代码语言:javascript
复制
    if (event instanceof ActiveEvent) {
        // This could become the sole method of dispatching in time.
        setCurrentEventAndMostRecentTimeImpl(event);
        ((ActiveEvent)event).dispatch();

我不知道为什么变量是空的。调试几乎是不可能的,因为所有事件都是由该代码处理的。

有人知道J8中Swing事件处理的变化吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-04-17 05:29:41

最后,弹出式菜单的打开必须重新安排在EDT上,即使它正在EDT上运行的代码打开。

代码语言:javascript
复制
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            jpopupMenu.show(c, x, y);
        }
    });

仅当在J8上运行时。

票数 4
EN

Stack Overflow用户

发布于 2015-04-20 22:13:19

此外,请确保如果您正在安装备用事件队列,则在它自己的事件上执行此操作,例如:

代码语言:javascript
复制
Swingutilities.invokeLater(){
    ... run() {
       ..do event queue push();
    }
}

问题是,事件队列推送没有迁移当前事件,只迁移挂起的事件。

票数 2
EN

Stack Overflow用户

发布于 2017-06-08 02:30:42

下面的工作很好:

代码语言:javascript
复制
   SwingUtilities.invokeLater(new Runnable() {
                  @Override
                  public void run() {
                      Toolkit.getDefaultToolkit().getSystemEventQueue().push(Customized Event);
                  }
              });
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29650874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档