我在主框架右侧的JMenu子菜单中有一个JMenuItem。
弹出子菜单时,它会显示在主菜单的右侧,位于主框架之外。
当在此状态下单击鼠标选择菜单项时,ActionEvent不会传播给动作侦听器。
有趣的是,使用enter选择键盘会导致调用动作侦听器。
当主框架展开以填满屏幕时,子菜单会弹出主菜单的左侧,因此位于主框架内。
在这种情况下,在菜单项中单击鼠标时会传播ActionEvent。
我在JMenuItem中添加了一个鼠标监听器来调试它,我注意到MOUSE_ENTERED和MOUSE_PRESSED事件确实发生但MOUSE_RELEASED事件不会发生,只有当JMenuItem在主框架内时才会发生。
我在Windows 7(64位)上使用Java 1.7.0_45。
有没有人遇到过这个问题?
答案 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")) {
希望这对其他人有用。