MenuSelectionManagerですべてのJPopupMenuを取得する
Total: 3107
, Today: 1
, Yesterday: 0
Posted by aterai at
Last-modified:
概要
MenuSelectionManager
ですべてのJPopupMenu
を取得し、任意のタイミングでそれらを非表示に切り替えます。
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
は閉じない
- Ctrl+2:
next1
JTable
に設定したJPopupMenu
を開いた状態(JPopupMenu
にフォーカスがある)の場合、JTabbedPane
に設定したキー入力(JComponent.WHEN_FOCUSED
)によるタブ切替アクションは実行不可
- Ctrl+3:
prev2
JTabbedPane
に設定したキー入力(JComponent.WHEN_IN_FOCUSED_WINDOW
)によるタブ切替アクションを実行する場合、直前に自前のマウスプレスイベント発行してすべてのJPopupMenu
を閉じる
- Ctrl+4:
next2
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
が取得できない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); } } }