JMenuBar内のJMenuをキャンセルした場合にその選択状態を維持する
Total: 1918
, Today: 2
, Yesterday: 1
Posted by aterai at
Last-modified:
概要
JMenuBar
直下のJMenu
をキャンセルで閉じた場合にその選択状態を維持するかどうかを設定します。
Screenshot
Advertisement
サンプルコード
// 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, Kotlin解説
上記のサンプルでは、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をキャンセルした場合の動作を変更する