Swing/PreserveTopLevelSelection のバックアップ(No.11)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/PreserveTopLevelSelection へ行く。
- 1 (2019-06-24 (月) 16:07:20)
- 2 (2019-10-14 (月) 03:09:05)
- 3 (2020-07-14 (火) 10:38:47)
- 4 (2021-12-15 (水) 20:50:50)
- 5 (2023-09-29 (金) 10:56:09)
- 6 (2024-02-09 (金) 14:09:39)
- 7 (2024-06-23 (日) 06:21:41)
- 8 (2025-01-03 (金) 08:57:02)
- 9 (2025-01-03 (金) 09:01:23)
- 10 (2025-01-03 (金) 09:02:38)
- 11 (2025-01-03 (金) 09:03:21)
- 12 (2025-01-03 (金) 09:04:02)
- category: swing folder: PreserveTopLevelSelection title: JMenuBar内のJMenuをキャンセルした場合にその選択状態を維持する tags: [JMenu, JMenuBar, Focus, LookAndFeel] author: aterai pubdate: 2019-06-24T15:54:33+09:00 description: JMenuBar直下のJMenuをキャンセルで閉じた場合にその選択状態を維持するかどうかを設定します。 image: https://drive.google.com/uc?id=1T6g79tQY4xA9kVjE53DiRWGIfHgIQs6p
Summary
JMenuBar
直下のJMenu
をキャンセルで閉じた場合にその選択状態を維持するかどうかを設定します。
Screenshot

Advertisement
Source Code Examples
// UIManager.put("Menu.preserveTopLevelSelection", Boolean.TRUE);
String key = "Menu.preserveTopLevelSelection";
Boolean b = UIManager.getBoolean(key);
JCheckBox preserveTopLevelSelectionCheck = new JCheckBox(key, b) {
@Override public void updateUI() {
super.updateUI();
setSelected(UIManager.getLookAndFeelDefaults().getBoolean(key));
UIManager.put(key, isSelected());
}
};
preserveTopLevelSelectionCheck.addActionListener(e ->
UIManager.put(key, ((JCheckBox) e.getSource()).isSelected()));
View in GitHub: Java, KotlinExplanation
上記のサンプルでは、JMenuBar
直下のJMenu
から開いたJPopupMenu
をESCキー入力でキャンセルして閉じた場合そのJMenu
の選択状態を維持するかどうかを切り替えてテストできます。
WindowsLookAndFeel
UIManager.getLookAndFeelDefaults().getBoolean("Menu.preserveTopLevelSelection")
の初期値はBoolean.TRUE
JMenuBar
直下のJMenu
から開いたJPopupMenu
をキャンセルで閉じた場合そのJMenu
の選択状態を維持する- この状態からもう一度ESCキー入力などで選択状態はクリアされる
- マウスクリックでキャンセルした場合は常に
JMenu
の選択状態はクリアされMenu.preserveTopLevelSelection
の設定には影響されない - サブメニューをキャンセルした場合は常に
JMenu
の選択状態は維持されMenu.preserveTopLevelSelection
の設定には影響されない
- その他の
LookAndFeel
(MetalLookAndFeel
、NimbusLookAndFeel
など)UIManager.getLookAndFeelDefaults().getBoolean("Menu.preserveTopLevelSelection")
の初期値はfalse
JMenuBar
直下のJMenu
から開いたJPopupMenu
をキャンセルで閉じた場合、そのJMenu
の選択状態はクリアされるUIManager.put("Menu.preserveTopLevelSelection", Boolean.TRUE)
を設定すれば、WindowsLookAndFeel
風にJMenu
の選択状態が維持される- サブメニューをキャンセルした場合は常に
JMenu
の選択状態は維持されMenu.preserveTopLevelSelection
の設定には影響されないMotifLookAndFeel
の場合サブメニューをキャンセルするとすべてのJPopupMenu
が閉じるUIManager.put("Menu.cancelMode", "hideLastSubmenu");
で最後のJPopupMenu
のみ閉じるよう切り替え可能- JMenuから開いたJPopupMenuをキャンセルした場合の動作を変更する