JMenuItem在主框架外部时不调用动作侦听器

时间:2015-01-27 16:18:26

标签: java swing actionlistener jmenu jmenuitem

我在主框架右侧的JMenu子菜单中有一个JMenuItem。

弹出子菜单时,它会显示在主菜单的右侧,位于主框架之外。

当在此状态下单击鼠标选择菜单项时,ActionEvent不会传播给动作侦听器。

有趣的是,使用enter选择键盘会导致调用动作侦听器。

当主框架展开以填满屏幕时,子菜单会弹出主菜单的左侧,因此位于主框架内。

在这种情况下,在菜单项中单击鼠标时会传播ActionEvent。

我在JMenuItem中添加了一个鼠标监听器来调试它,我注意到MOUSE_ENTERED和MOUSE_PRESSED事件确实发生但MOUSE_RELEASED事件不会发生,只有当JMenuItem在主框架内时才会发生。

我在Windows 7(64位)上使用Java 1.7.0_45。

有没有人遇到过这个问题?

1 个答案:

答案 0 :(得分:0)

问题是由我们的应用程序中的以下初始化代码引起的,这是Java 6中的问题的解决方法:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6770457

    // Workaround for issue
    // (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6770457)
    PopupFactory.setSharedInstance(new PopupFactory() {

        @Override
        public Popup getPopup(Component owner, Component contents, int x, int y) {
            Window win = SwingUtilities.getWindowAncestor(owner);
            if (win.isActive()) {
                return super.getPopup(owner, contents, x, y);
            }
            return super.getPopup(JOptionPane.getRootFrame(), contents, x, y);
        }
    });
    // end fix

解决方案是修改if语句,如下所示:

            if (win.isActive() || win.getClass().getName().equalsIgnoreCase("javax.swing.Popup$HeavyWeightWindow")) {

希望这对其他人有用。