Swing/StayOpenCheckBoxMenuItem のバックアップの現在との差分(No.5)
- バックアップ一覧
- 差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- バックアップ を表示
- Swing/StayOpenCheckBoxMenuItem へ行く。
- 1 (2016-02-01 (月) 01:18:25)
- 2 (2016-02-01 (月) 14:05:46)
- 3 (2016-05-30 (月) 16:08:11)
- 4 (2016-09-07 (水) 19:06:13)
- 5 (2016-09-15 (木) 18:43:20)
- 6 (2017-03-29 (水) 13:55:09)
- 7 (2017-04-07 (金) 13:51:51)
- 8 (2018-02-09 (金) 19:16:45)
- 9 (2018-02-24 (土) 19:51:30)
- 10 (2020-01-28 (火) 16:34:38)
- 11 (2021-07-25 (日) 23:18:33)
- 12 (2022-08-20 (土) 22:15:25)
- 追加された行はこの色です。
- 削除された行はこの色です。
--- category: swing folder: StayOpenCheckBoxMenuItem title: JCheckBoxMenuItemをクリックしてもJPopupMenuを閉じないように設定する tags: [JCheckBoxMenuItem, JCheckBox, JPopupMenu] author: aterai pubdate: 2016-02-01T01:14:27+09:00 description: JPopupMenuにクリックしてもポップアップが開いたままの状態を維持するように設定したJCheckBoxMenuItemやJCheckBoxを追加します。 image: https://lh3.googleusercontent.com/-hje86Y7xU8k/Vq4umT64DuI/AAAAAAAAOMs/N6gysnrA3e4/s800-Ic42/StayOpenCheckBoxMenuItem.png hreflang: href: http://java-swing-tips.blogspot.com/2016/05/keep-visible-jpopupmenu-while-clicking.html href: https://java-swing-tips.blogspot.com/2016/05/keep-visible-jpopupmenu-while-clicking.html lang: en --- * 概要 [#summary] `JPopupMenu`にクリックしてもポップアップが開いたままの状態を維持するように設定した`JCheckBoxMenuItem`や`JCheckBox`を追加します。 #download(https://lh3.googleusercontent.com/-hje86Y7xU8k/Vq4umT64DuI/AAAAAAAAOMs/N6gysnrA3e4/s800-Ic42/StayOpenCheckBoxMenuItem.png) * サンプルコード [#sourcecode] #code(link){{ JMenuItem mi = new JMenuItem(" "); mi.setLayout(new BorderLayout()); mi.add(new JCheckBox(title) { private transient MouseAdapter handler; @Override public void updateUI() { removeMouseListener(handler); removeMouseMotionListener(handler); super.updateUI(); handler = new DispatchParentHandler(); addMouseListener(handler); addMouseMotionListener(handler); setFocusable(false); setOpaque(false); } }); popup.add(mi); popup.add(new JCheckBoxMenuItem("keeping open #2") { @Override public void updateUI() { super.updateUI(); setUI(new BasicCheckBoxMenuItemUI() { @Override protected void doClick(MenuSelectionManager msm) { //super.doClick(msm); // super.doClick(msm); System.out.println("MenuSelectionManager: doClick"); menuItem.doClick(0); } }); } }); }} * 解説 [#explanation] - `JCheckBox` -- `JPopupMenu`に`JCheckBox`を追加 -- クリックしてもポップアップは閉じないが、カーソルが乗ってもハイライトされない -- クリックしてもポップアップは閉じないが、マウスカーソルが乗ってもハイライト表示されない - `JMenuItem + JCheckBox` -- `JCheckBox`を配置したタイトルが空の`JMenuItem`を作成して`JPopupMenu`に追加 -- `JCheckBox`へのマウスイベント(`MOUSE_DRAGGED`, `MOUSE_ENTERED`, `MOUSE_EXITED`, `MOUSE_MOVED`)を親の`JMenuItem`に転送してハイライトを描画 -- `JCheckBox`へのマウスクリックイベント(`MOUSE_CLICKED`, `MOUSE_PRESSED`, `MOUSE_RELEASED`など)はブロックしてポップアップは閉じないように設定 - `JCheckBoxMenuItem` -- デフォルトの`JCheckBoxMenuItem`で、クリックするとポップアップは閉じる -- デフォルトの`JCheckBoxMenuItem`をクリックするとポップアップは閉じる - `keeping open #1` -- `JCheckBoxMenuItem`に`Action`を追加して、クリック後にポップアップを再度開くように設定 -- `JPopupMenu`が`JFrame`の外に表示される場合は、ポップアップが一瞬消える -- `JCheckBoxMenuItem`に`Action`を追加してクリック後にポップアップを再度開くように設定 -- `JPopupMenu`が`JFrame`の外に表示される場合はポップアップが一瞬消える - `keeping open #2` -- `JCheckBoxMenuItem`に`BasicCheckBoxMenuItemUI#doClick(MenuSelectionManager)`メソッドをオーバーライドした`CheckBoxMenuItemUI`を設定 --- このイベントでクリック後にポップアップを閉じない代わりに、`menuItem.doClick(0);`でチェック状態のみ変更する --- 参考: [http://stackoverflow.com/questions/3759379/how-to-prevent-jpopupmenu-disappearing-when-checking-checkboxes-in-it swing - How to prevent JPopUpMenu disappearing when checking checkboxes in it? - Stack Overflow] --- このイベントでクリック後にポップアップを閉じない代わりに`menuItem.doClick(0);`でチェック状態のみ変更する --- 参考: [https://stackoverflow.com/questions/3759379/how-to-prevent-jpopupmenu-disappearing-when-checking-checkboxes-in-it swing - How to prevent JPopUpMenu disappearing when checking checkboxes in it? - Stack Overflow] ---- - `JDK 9`では、`menuItem.putClientProperty("CheckBoxMenuItem.closeOnMouseClick", false);`などと設定することで、クリックしても`JPopupMenu`を閉じないようにすることが可能になる -- 参考: [https://bugs.openjdk.java.net/browse/JDK-8165234 JDK-8165234 Provide a way to not close toggle menu items on mouse click on component level - Java Bug System] - `Java 9`では、%%`menuItem.putClientProperty("CheckBoxMenuItem.closeOnMouseClick", false);`%% `menuItem.putClientProperty("CheckBoxMenuItem.doNotCloseOnMouseClick", true);`などと設定することで、対象の`JCheckBoxMenuItem`をクリックしても親の`JPopupMenu`は閉じなくなる -- `UIManager.put("CheckBoxMenuItem.doNotCloseOnMouseClick", true)`で全体の`JCheckBoxMenuItem`に適用可能 -- 参考: [https://bugs.openjdk.org/browse/JDK-8165234 JDK-8165234 Provide a way to not close toggle menu items on mouse click on component level - Java Bug System] * 参考リンク [#reference] - [http://stackoverflow.com/questions/3759379/how-to-prevent-jpopupmenu-disappearing-when-checking-checkboxes-in-it swing - How to prevent JPopUpMenu disappearing when checking checkboxes in it? - Stack Overflow] - [https://stackoverflow.com/questions/3759379/how-to-prevent-jpopupmenu-disappearing-when-checking-checkboxes-in-it swing - How to prevent JPopUpMenu disappearing when checking checkboxes in it? - Stack Overflow] * コメント [#comment] #comment #comment