JPopupMenuなどからWindowを閉じる
Total: 5438
, Today: 1
, Yesterday: 3
Posted by aterai at
Last-modified:
概要
JPopupMenu
や、JToolBar
などに親Window
を閉じるためのAction
を作成します。
Screenshot
Advertisement
サンプルコード
private static class ExitAction extends AbstractAction {
public ExitAction() {
super("Exit");
}
@Override public void actionPerformed(ActionEvent e) {
JComponent c = (JComponent) e.getSource();
Window window = null;
Container parent = c.getParent();
if (parent instanceof JPopupMenu) {
JPopupMenu popup = (JPopupMenu) parent;
JComponent invoker = (JComponent) popup.getInvoker();
window = SwingUtilities.getWindowAncestor(invoker);
} else if (parent instanceof JToolBar) {
JToolBar toolbar = (JToolBar) parent;
if (((BasicToolBarUI) toolbar.getUI()).isFloating()) {
window = SwingUtilities.getWindowAncestor(toolbar).getOwner();
} else {
window = SwingUtilities.getWindowAncestor(toolbar);
}
} else {
Component invoker = c.getParent();
window = SwingUtilities.getWindowAncestor(invoker);
}
if (window != null) {
// window.dispose();
window.dispatchEvent(new WindowEvent(window, WindowEvent.WINDOW_CLOSING));
}
}
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、親となるJFrame
を取得してwindow.dispatchEvent(new WindowEvent(window, WindowEvent.WINDOW_CLOSING));
を使用し、これを閉じるためのイベントを実行しています。
コンポーネントの親Window
を取得する場合、SwingUtilities.getWindowAncestor(...)
などが使用可能ですが、HeavyWeightWindow
なJPopupMenu
やFloating
中のJToolBar
では親Window
とは異なるWindow
が使用されるので注意が必要です。
JPopupMenu
JPopupMenu#getInvoker()
を使用してJComponent#setComponentPopupMenu(popup)
で設定したコンポーネントを取得し、SwingUtilities.getWindowAncestor(...)
メソッドで親Window
を取得
JMenuBar
SwingUtilities.getWindowAncestor(...)
メソッドで自身の親Window
を取得
JToolBar
- 移動中の場合、
JComponent#setComponentPopupMenu(toolbar)
メソッドで取得した移動中のWindow
の親Window
をWindow#getOwner()
で取得 - 移動中では無い場合、
SwingUtilities.getWindowAncestor(toolbar)
メソッドで自身の親Window
を取得
- 移動中の場合、