JMenuBar内のJMenuをキャンセルした場合にその選択状態を維持する
Total: 2241, Today: 1, Yesterday: 1
Posted by aterai at
Last-modified:
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, KotlinDescription
上記のサンプルでは、JMenuBar直下のJMenuから開いたJPopupMenuをESCキー入力でキャンセルして閉じた場合そのJMenuの選択状態を維持するかどうかを切り替えてテストできます。
WindowsLookAndFeelUIManager.getLookAndFeelDefaults().getBoolean("Menu.preserveTopLevelSelection")の初期値はBoolean.TRUEJMenuBar直下のJMenuから開いたJPopupMenuをキャンセルで閉じた場合そのJMenuの選択状態を維持する- この状態からもう一度ESCキー入力などで選択状態はクリアされる
- マウスクリックでキャンセルした場合は常に
JMenuの選択状態はクリアされMenu.preserveTopLevelSelectionの設定には影響されない - サブメニューをキャンセルした場合は常に
JMenuの選択状態は維持されMenu.preserveTopLevelSelectionの設定には影響されない
- その他の
LookAndFeel(MetalLookAndFeel、NimbusLookAndFeelなど)UIManager.getLookAndFeelDefaults().getBoolean("Menu.preserveTopLevelSelection")の初期値はfalseJMenuBar直下のJMenuから開いたJPopupMenuをキャンセルで閉じた場合、そのJMenuの選択状態はクリアされるUIManager.put("Menu.preserveTopLevelSelection", Boolean.TRUE)を設定すれば、WindowsLookAndFeel風にJMenuの選択状態が維持される- サブメニューをキャンセルした場合は常に
JMenuの選択状態は維持されMenu.preserveTopLevelSelectionの設定には影響されないMotifLookAndFeelの場合サブメニューをキャンセルするとすべてのJPopupMenuが閉じるUIManager.put("Menu.cancelMode", "hideLastSubmenu");で最後のJPopupMenuのみ閉じるよう切り替え可能- JMenuから開いたJPopupMenuをキャンセルした場合の動作を変更する