右键单击GUI中的某些组件时,我正在使用显示的JPopupMenu。

现在,我必须销毁在这种2种情况下显示的弹出菜单:


用户单击显示在弹出窗口中的菜单项(执行相关操作并关闭弹出窗口)
用户单击屏幕上的其他位置(不执行任何操作关闭弹出窗口)


我解决了这个问题,将当前可见的弹出窗口存储到ArrayList中,并在发生前两种情况之一时将它们手动设置为不可见。

所以,我想知道两件事:


有没有一种更干净的方法,而无需手动引用所有活动弹出窗口? (也许任何Swing功能都能做到这一点?)
是否足以设置一个弹出窗口,使其不可见,不再有对该对象的引用,以释放其分配的内存?还是我使用了dispose之类的方法? (JPopupMenu中没有定义处理方法)


显示我的实际代码有点困难,因为它有点复杂。无论如何,它会执行以下操作:

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无法正确消失。

最佳答案

这是默认行为。

阅读有关Bringing Up a Popup Menu的Swing教程中的部分,以获得解释和工作示例。

关于java - 在Java Swing中销毁JPopupMenu,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5530104/

10-08 22:28