Я использую JPopupMenu, отображаемый, когда я щелкаю правой кнопкой мыши определенные компоненты в своем графическом интерфейсе.
Теперь мне нужно уничтожить всплывающее меню, отображаемое в этой ситуации 2:
- Пользователь щелкает элемент меню, отображаемый во всплывающем окне (выполняет соответствующее действие и закрывает всплывающее окно).
- Пользователь щелкает где-то еще на экране (закрывает всплывающее окно, ничего не делая)
Я решил эту проблему, сохранив в ArrayList текущие видимые всплывающие окна, и вручную сделал их невидимыми, когда произошла одна из двух предыдущих ситуаций.
Итак, я хотел бы знать 2 вещи:
- Есть ли более чистый способ сделать это без ручного получения ссылки на все активные всплывающие окна? (возможно, это достигается какой-либо функцией 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 не исчезает должным образом.
JDialog
. Но, как сказал camickr,this is the default behavior
. - person mre   schedule 03.04.2011