Java3d applet中的JPopupMenu无法接收鼠标或键盘输入

4
我有一个使用Java3D和填充了JMenuItems的JPopupMenus的Java应用程序。当作为常规应用程序运行时,一切正常--JPopupMenus和其他所有内容的行为都符合预期。但是,当我将应用程序制作成applet时,弹出在Canvas3D上方的JPopupMenu不像预期那样工作。具体而言,JPopupMenu的行为如下:
  1. 鼠标移动到菜单项上时,菜单项没有高亮显示
  2. 无法使用箭头键浏览菜单项
  3. 单击顶级JMenuItem会完成操作并突出显示该项,但它不像常规应用程序中那样销毁JPopupMenu
  4. 单击包含子菜单的顶级JMenuItem不起作用
  5. 单击JPopupMenu之外的区域不会像常规应用程序中那样销毁JPopupMenu
  6. 当JPopupMenu被显示时,在我的程序的swing部分上打开JPopupMenu会使JPopupMenu在Canvas3D上表现出常规和预期的行为,但仍然存在第5点

以下是一些更多信息:

  • JPopupMenu是使用与持有Canvas3D的JPanel相关的JPopupMenu.show()显示的
  • 在创建任何JPopupMenus之前,我调用了JPopupMenu.setDefaultLightWeightPopupEnabled(false),但这条线似乎没有什么区别
  • 我认为这可能是一个焦点问题,但JPopupMenu.requestFocusInWindow()不起作用

因此,我的问题是:是什么导致应用程序和applet之间的行为不同,以及如何使applet中的JPopupMenu像应用程序中那样工作?

2个回答

5
你需要将轻量级的JPopup更改为重量级的,否则在不发布你的SSCCE的情况下无法讨论其他内容。

JPopupMenu.setDefaultLightWeightPopupEnabled(false) 的作用是使该调用之后创建的所有 JPopupMenu 变成重量级组件。此外,我会制作一个 SSCCE,但是需要大量代码才能实现基本的实现,而且我认为这可能更多是一个概念问题,因为桌面应用程序运行良好,只有小程序出现问题。 - mahercbeaucoup
1
据我所知,所有CAD/CAM、3D等方面的良好解决方案都是基于AWT的,也许你需要使用带有Swing JMenuItem的AWT Popup,或者混合重量级容器和轻量级JComponents。你能否使用GlassPane进行测试(设置为BorderLayout并放置非不透明JLabel以及一些背景和Alpha透明度),如果后面有GlassPane,则必须使用AWT弹出式容器,没有例外。 - mKorbel
我正在测试这个问题,但如果JPopupMenu是轻量级的,它不会出现,对吗?Canvas3D是重量级的,所以根据http://java.sun.com/products/jfc/tsc/articles/mixing/,我预计根本看不到JPopupMenu。 - mahercbeaucoup
将所有东西切换到AWT就解决了问题。感谢您建议这条路线。 - mahercbeaucoup
很高兴能帮助你,嗯,事实是...我已经困扰了一个星期以上。 - mKorbel

0

我通过将调用者设置在JPopMenu上并使其成为HeavyWeight来解决了这个问题。

final JPopupMenu popup = new JPopupMenu();
popup.setLightWeightPopupEnabled(false);
popup.setInvoker(myJFrame);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接