概要

JMenuから開いたJPopupMenuをキャンセルした場合、カレントのサブメニューから閉じるか、すべてのメニューツリーを閉じるかを設定します。

サンプルコード

String key = "Menu.cancelMode";

String cancelMode = UIManager.getString(key);
System.out.println(key + ": " + cancelMode);
boolean defaultMode = "hideMenuTree".equals(cancelMode);
JRadioButton hideMenuTreeRadio = makeRadioButton("hideMenuTree", defaultMode);
JRadioButton hideLastSubmenuRadio = makeRadioButton("hideLastSubmenu", !defaultMode);

Box box = Box.createHorizontalBox();
box.setBorder(BorderFactory.createTitledBorder(key));
ItemListener handler = e -> {
  if (e.getStateChange() == ItemEvent.SELECTED) {
    JRadioButton r = (JRadioButton) e.getSource();
    UIManager.put(key, r.getText());
  }
};
ButtonGroup bg = new ButtonGroup();
Stream.of(hideLastSubmenuRadio, hideMenuTreeRadio).forEach(r -> {
  r.addItemListener(handler);
  bg.add(r);
  box.add(r);
});
add(box);
View in GitHub: Java, Kotlin

解説

  • UIManager.put("Menu.cancelMode", "hideLastSubmenu");
    • BasicLookAndFeelMetalLookAndFeelWindowsLookAndFeelなどのデフォルト
    • ESCキー入力によるキャンセルでメニューツリーの最後に開かれたJPopupMenuのみ閉じる
  • UIManager.put("Menu.cancelMode", "hideMenuTree");
    • MotifLookAndFeelGTKLookAndFeelのデフォルト
    • ESCキー入力によるキャンセルですべてのメニューツリーのJPopupMenuを閉じる

参考リンク

コメント