Swing/MenuCancelMode のバックアップソース(No.2)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- バックアップ を表示
- Swing/MenuCancelMode へ行く。
- 1 (2019-10-14 (月) 03:03:21)
- 2 (2021-05-14 (金) 19:24:45)
--- category: swing folder: MenuCancelMode title: JMenuから開いたJPopupMenuをキャンセルした場合の動作を変更する tags: [JMenu, JPopupMenu, LookAndFeel, UIManager] author: aterai pubdate: 2019-10-14T03:01:26+09:00 description: JMenuから開いたJPopupMenuをキャンセルした場合、カレントのサブメニューから閉じるか、すべてのメニューツリーを閉じるかを設定します。 image: https://drive.google.com/uc?id=1KMgWDSQkZS95tcgDW87x4bzZd4_M3mdV --- * 概要 [#summary] `JMenu`から開いた`JPopupMenu`をキャンセルした場合、カレントのサブメニューから閉じるか、すべてのメニューツリーを閉じるかを設定します。 #download(https://drive.google.com/uc?id=1KMgWDSQkZS95tcgDW87x4bzZd4_M3mdV) * サンプルコード [#sourcecode] #code(link){{ 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); }} * 解説 [#explanation] - `UIManager.put("Menu.cancelMode", "hideLastSubmenu");` -- KBD{ESC}キー入力によるキャンセルでメニューツリーの最後に開かれた`JPopupMenu`のみ閉じる -- `BasicLookAndFeel`、`MetalLookAndFeel`、`WindowsLookAndFeel`などのデフォルト - `UIManager.put("Menu.cancelMode", "hideMenuTree");` -- KBD{ESC}キー入力によるキャンセルですべてのメニューツリーの`JPopupMenu`を閉じる -- `MotifLookAndFeel`、`GTKLookAndFeel`のデフォルト * 参考リンク [#reference] - [[JMenuBar内のJMenuをキャンセルした場合にその選択状態を維持する>Swing/PreserveTopLevelSelection]] * コメント [#comment] #comment #comment