在Java Swing中销毁JPopupMenu

在Java Swing中销毁JPopupMenu,java,swing,jpopupmenu,Java,Swing,Jpopupmenu,我使用的是在GUI中的某些组件上单击鼠标右键时显示的JPopupMenu 现在,我必须销毁在这2种情况下显示的弹出菜单: 用户单击弹出窗口中显示的菜单项(执行相关操作并关闭弹出窗口) 用户单击屏幕上的其他位置(关闭弹出窗口而不执行任何操作) 我解决了将当前可见的弹出窗口存储到ArrayList中的问题,并手动将它们设置为在发生前两种情况之一时不可见 所以,我想知道两件事: 有没有更干净的方法,不用手动引用所有活动的弹出窗口?(也许任何Swing功能都可以实现这一点?) 仅仅是将一个弹出窗口设置为

我使用的是在GUI中的某些组件上单击鼠标右键时显示的JPopupMenu

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

  • 用户单击弹出窗口中显示的菜单项(执行相关操作并关闭弹出窗口)
  • 用户单击屏幕上的其他位置(关闭弹出窗口而不执行任何操作)
  • 我解决了将当前可见的弹出窗口存储到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;
    }
    
    其中EditorOpupMenu扩展了JPopupMenu。当在特定对象上单击并指定对象构造其弹出菜单并返回时,鼠标侦听器将调用前面的代码

    从鼠标听筒内部:

    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);
                     }
    
                 }
    

    就这些。有了这段代码,我的JPOppMenu无法正常消失。

    这是默认行为


    阅读上Swing教程中的部分以获得解释和工作示例。

    使用
    show
    方法而不是
    setVisible
    方法。

    我今天早上可能有点胖,但这不正是Swing默认的行为吗?我以前经常使用JPopupMenu,而且从来没有手动隐藏过一个。@I82Much:似乎没有。我认为我描述的也是默认行为,但事实并非如此。您能提供一些代码吗?我刚刚测试了一下,你所描述的是(对我来说)实际发生的事情@I82Much@Tedil:我编辑了我的帖子。检查并感谢您的关注用户单击屏幕上的其他位置(关闭弹出窗口而不执行任何操作):您为什么希望此行为?它似乎应该是默认行为。你是对的。不管怎样,这对我不起作用。我发布了一些代码。你知道吗?@Overbose,“一些代码”没有帮助。我们无法说出代码的使用方式/位置。我给了您一个指向Swing教程的链接,其中包含一个工作示例。从这个例子中学习。