Уничтожить JPopupMenu в Java Swing - PullRequest
1 голос
/ 03 апреля 2011

Я использую JPopupMenu, отображаемый при щелчке правой кнопкой мыши по определенным компонентам в моем графическом интерфейсе.

Теперь мне нужно уничтожить всплывающее меню, отображаемое в этой ситуации:

  1. Пользователь нажимает на элемент меню, отображаемый во всплывающем окне (выполните соответствующее действие и закройте всплывающее окно).
  2. Пользователь щелкает где-то еще на экране (закрывайте всплывающее окно, ничего не делая)

Я решил эту проблему, сохранив в ArrayList текущие видимые всплывающие окна, и я вручную установил их какневидим, когда произошла одна из двух предыдущих ситуаций.

Итак, я хотел бы знать 2 вещи:

  1. Есть ли более чистый способ сделать это, не используя вручную ссылку на всеактивные всплывающие окна?(может быть, какая-нибудь функция Swing это делает?)
  2. Достаточно ли просто установить невидимое всплывающее окно, не имеющее больше ссылок на этот объект, чтобы освободить выделенную память?Или я должен использовать метод, как распоряжаться?(в 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 не исчезает должным образом.

Ответы [ 2 ]

1 голос
/ 13 мая 2011

Используйте метод show вместо метода setVisible.

1 голос
/ 03 апреля 2011

Это поведение по умолчанию.

Прочитайте раздел из учебника по Swing на Вызов всплывающего меню для объяснения и рабочего примера.

...