GUI で特定のコンポーネントを右クリックすると表示される JPopupMenu を使用しています。
次に、この 2 つの状況で表示されるポップアップ メニューを破棄する必要があります。
- ユーザーがポップアップに表示されたメニュー エントリをクリックします (関連するアクションを実行してポップアップを閉じます)。
- ユーザーが画面上の別の場所をクリックします (何もせずにポップアップを閉じます)
現在表示されているポップアップをArrayListに格納してこの問題を解決し、前の2つの状況のいずれかが発生したときに手動で非表示に設定しました。
だから、私は2つのことを知りたい:
- すべてのアクティブなポップアップの参照を手動で取得せずに、それを行うよりクリーンな方法はありますか? (おそらく、どの 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;
}
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 が適切に消えません。