【发布时间】:2011-04-03 14:18:26
【问题描述】:
我使用的是在我的 GUI 中右键单击某些组件时显示的 JPopupMenu。
现在我必须销毁在这两种情况下显示的弹出菜单:
- 用户单击弹出窗口中显示的菜单条目(执行相关操作并关闭弹出窗口)
- 用户单击屏幕上的其他位置(不做任何操作关闭弹出窗口)
我解决了这个问题,将当前可见的弹出窗口存储到 ArrayList 中,并在前两种情况之一发生时手动将它们设置为不可见。
所以,我想知道两件事:
- 是否有任何更简洁的方法可以在不手动获取所有活动弹出窗口的引用的情况下做到这一点? (也许任何 Swing 功能都可以做到这一点?)
- 是否足以设置一个不可见的弹出窗口,不再引用该对象,以释放其分配的内存?还是我必须使用 dispose 之类的方法? (JPopupMenu 中没有定义 dispose 方法)
展示我的实际代码有点困难,因为它有点复杂。无论如何,它会执行以下操作:
public EditorPopupMenu getPopupMenu() {
this.popupMenu = new EditorPopupMenu();
EditorMenuItem copy = GuiConcreteFactory.getInstance().createMenuItem(Gui.getInstance().copyItemAction);
EditorMenuItem cut = GuiConcreteFactory.getInstance().createMenuItem(Gui.getInstance().cutItemAction);
EditorMenuItem paste = GuiConcreteFactory.getInstance().createMenuItem(Gui.getInstance().pasteItemAction);
this.popupMenu.add(copy);
this.popupMenu.add(cut);
this.popupMenu.add(paste);
this.popupMenu.addSeparator();
EditorMenuItem settings = GuiConcreteFactory.getInstance().createMenuItem(
new ApplicationShowDialogAction("settings",null,
new EditorAreaDialog (this)) );
this.popupMenu.add(settings);
return popupMenu;
}
EditorPopupMenu 扩展了 JPopupMenu。当单击特定对象并且指定对象构造其弹出菜单并返回它时,MouseListener 会调用先前的代码。
从 MouseListener 内部:
if (me.getModifiers() == InputEvent.BUTTON3_MASK){
// //System.out.println("ResizableMouseAdapter: BUTTON_3_MASK");
EditorPopupMenu popupMenu = sourceComp.getType().getPopupMenu();
if ( popupMenu!= null){
//System.out.println("COMPONENT HAS A POPUP MENU");
popupMenu.setLocation( sourceComp.getLocationOnScreen().x + me.getX(),
sourceComp.getLocationOnScreen().y + me.getY());
popupMenu.setVisible(true);
Gui.getInstance().addActivePopup(popupMenu);
}
}
这就是全部。使用此代码,我的 JPopupMenu 无法正常消失。
【问题讨论】:
-
今天早上我可能有点粗,但这不正是 Swing 默认的行为吗?我以前用过很多 JPopupMenu,从来没有手动隐藏过。
-
@I82Much:好像没有。我认为我所描述的也是一种默认行为,但事实并非如此。
-
你能提供一些代码吗?我刚刚对其进行了测试,您所描述的是实际发生的情况(对我而言)
-
@I82Much @Tedil:我编辑了我的帖子。检查并感谢您的关注
-
用户点击屏幕上的其他地方(关闭弹出窗口而不做任何事情):你为什么想要这种行为?
标签: java swing jpopupmenu