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