概要

JMenuBar直下のJMenuをキャンセルで閉じた場合にその選択状態を維持するかどうかを設定します。

スクリーンショット

Swing/PreserveTopLevelSelection.png

サンプルコード

// UIManager.put("Menu.preserveTopLevelSelection", Boolean.TRUE);
String key = "Menu.preserveTopLevelSelection";
Boolean b = UIManager.getBoolean(key);
System.out.println(key + ": " + b);
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 all

解説

上記のサンプルでは、JMenuBar直下のJMenuから開いたJPopupMenuESCキー入力でキャンセルして閉じた場合、そのJMenuの選択状態を維持するかどうかを切り替えてテストできます。

  • WindowsLookAndFeel
    • UIManager.getLookAndFeelDefaults().getBoolean("Menu.preserveTopLevelSelection")の初期値はtrue
    • JMenuBar直下のJMenuから開いたJPopupMenuをキャンセルで閉じた場合、そのJMenuの選択状態を維持する
      • この状態でもう一度キャンセルキー(ESC)を入力すると選択状態はクリアされる
    • マウスクリックでキャンセルした場合は常にJMenuの選択状態はクリアされ、Menu.preserveTopLevelSelectionには影響されない
    • サブメニューをキャンセルした場合は常にJMenuの選択状態は維持され、Menu.preserveTopLevelSelectionには影響されない
  • その他のLookAndFeel(MetalLookAndFeelNimbusLookAndFeelなど)
    • UIManager.getLookAndFeelDefaults().getBoolean("Menu.preserveTopLevelSelection")の初期値はfalse
    • JMenuBar直下のJMenuから開いたJPopupMenuをキャンセルで閉じた場合、そのJMenuの選択状態はクリアされる
    • UIManager.put("Menu.preserveTopLevelSelection", Boolean.TRUE)を設定すれば、WindowsLookAndFeel風にJMenuの選択状態が維持される
    • サブメニューをキャンセルした場合は常にJMenuの選択状態は維持され、Menu.preserveTopLevelSelectionには影響されない

参考リンク

コメント