Swing/GetAllPopupMenus のバックアップの現在との差分(No.5)
- category: swing folder: GetAllPopupMenus title: MenuSelectionManagerですべてのJPopupMenuを取得する tags: [JPopupMenu, Focus] author: aterai pubdate: 2017-01-30T15:17:50+09:00 description: MenuSelectionManagerですべてのJPopupMenuを取得し、任意のタイミングでそれらを非表示に切り替えます。 image: https://drive.google.com/uc?export=view&id=18mKH-3iW9D0-aw0doM7C-6-hFWoe-JMa7w image: https://drive.google.com/uc?id=18mKH-3iW9D0-aw0doM7C-6-hFWoe-JMa7w
概要
MenuSelectionManager
ですべてのJPopupMenu
を取得し、任意のタイミングでそれらを非表示に切り替えます。
Screenshot
Advertisement
Screenshot
Advertisement
サンプルコード
tabs.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
KeyStroke.getKeyStroke(KeyEvent.VK_4, KeyEvent.CTRL_MASK), "next2");
tabs.getActionMap().put("next2", new AbstractAction() {
@Override public void actionPerformed(ActionEvent e) {
for (MenuElement m: MenuSelectionManager.defaultManager().getSelectedPath()) {
if (m instanceof JPopupMenu) {
((JPopupMenu) m).setVisible(false);
}
}
tabs.setSelectedIndex((tabs.getSelectedIndex() + 1) % tabs.getTabCount());
}
});
View in GitHub: Java, Kotlin解説
- Ctrl+1:
prev1
-
JTable
に設定したJPopupMenu
を開いた状態で、JTabbedPane
に設定したキー入力(JComponent.WHEN_IN_FOCUSED_WINDOW
)によるタブ切替アクションを実行すると、JPopupMenu
が開いたまま前のタブの選択が実行される -
requestFocusInWindow()
などでフォーカスをJTable
以外に移動しても、JPopupMenu
は閉じない -
JTable
に設定したJPopupMenu
を開いた状態でJTabbedPane
に設定したキー入力(JComponent.WHEN_IN_FOCUSED_WINDOW
)によるタブ切替アクションを実行するとJPopupMenu
が開いたまま前のタブの選択が実行される -
requestFocusInWindow()
などでフォーカスをJTable
以外に移動してもJPopupMenu
は閉じない
-
- Ctrl+2:
next1
-
JTable
に設定したJPopupMenu
を開いた状態(JPopupMenu
にフォーカスがある)の場合、JTabbedPane
に設定したキー入力(JComponent.WHEN_FOCUSED
)によるタブ切替アクションは、実行することはできない -
JTable
に設定したJPopupMenu
を開いた状態(JPopupMenu
にフォーカスがある)の場合、JTabbedPane
に設定したキー入力(JComponent.WHEN_FOCUSED
)によるタブ切替アクションは実行不可
-
- Ctrl+3:
prev2
-
JTabbedPane
に設定したキー入力(JComponent.WHEN_IN_FOCUSED_WINDOW
)によるタブ切替アクションを実行する場合、直前にダミーのマウスプレスイベント発行してすべてのJPopupMenu
を閉じる -
JTabbedPane
に設定したキー入力(JComponent.WHEN_IN_FOCUSED_WINDOW
)によるタブ切替アクションを実行する場合、直前に自前のマウスプレスイベント発行してすべてのJPopupMenu
を閉じる
-
- Ctrl+4:
next2
-
JTabbedPane
に設定したキー入力(JComponent.WHEN_IN_FOCUSED_WINDOW
)によるタブ切替アクションを実行する場合、MenuSelectionManager#getSelectedPath()
ですべてのJPopupMenu
を取得し、JPopupMenu#setVisible(false)
で非表示にする -
JTabbedPane
に設定したキー入力(JComponent.WHEN_IN_FOCUSED_WINDOW
)によるタブ切替アクションを実行する場合、MenuSelectionManager#getSelectedPath()
ですべてのJPopupMenu
を取得してJPopupMenu#setVisible(false)
で非表示にする - 参考:
javax/swing/plaf/basic/BasicPopupMenuUI.java
のList<JPopupMenu> getPopups()
メソッド
-
- 以下のように、
LayeredPane#getComponentsInLayer(JLayeredPane.POPUP_LAYER)
で表示中のJPopupMenu
を取得する方法もあるが、JFrame
の外に表示される場合のHeavyWeightWindow
を使用したJPopupMenu
が取得できない - 以下のように
LayeredPane#getComponentsInLayer(JLayeredPane.POPUP_LAYER)
で表示中のJPopupMenu
を取得する方法もあるが、親JFrame
の外に表示されるHeavyWeightWindow
を使用したJPopupMenu
が取得できないJLayeredPane lp = ((JFrame) tabs.getTopLevelAncestor()).getLayeredPane(); for (Component c: lp.getComponentsInLayer(JLayeredPane.POPUP_LAYER)) { for (Component p: ((Container) c).getComponents()) { if (p instanceof JPopupMenu) { p.setVisible(false); } } }
参考リンク
- java - JPopupMenu not closing on keyevent - Stack Overflow
- java - JPopupMenu not closing on keyevent - Stack Overflow