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:
hreflang:
href: http://java-swing-tips.blogspot.com/2016/05/keep-visible-jpopupmenu-while-clicking.html lang: en
概要
JPopupMenu
にクリックしてもポップアップが開いたままの状態を維持するように設定したJCheckBoxMenuItem
やJCheckBox
を追加します。
Screenshot
Advertisement
サンプルコード
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);
System.out.println("MenuSelectionManager: doClick");
menuItem.doClick(0);
}
});
}
});
View in GitHub: Java, Kotlin解説
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
で、クリックするとポップアップは閉じる
- デフォルトの
keeping open #1
JCheckBoxMenuItem
にAction
を追加して、クリック後にポップアップを再度開くように設定JPopupMenu
がJFrame
の外に表示される場合は、ポップアップが一瞬消える
keeping open #2
JCheckBoxMenuItem
にBasicCheckBoxMenuItemUI#doClick(MenuSelectionManager)
メソッドをオーバーライドしたCheckBoxMenuItemUI
を設定- このイベントでクリック後にポップアップを閉じない代わりに、
menuItem.doClick(0);
でチェック状態のみ変更する - 参考: swing - How to prevent JPopUpMenu disappearing when checking checkboxes in it? - Stack Overflow
- このイベントでクリック後にポップアップを閉じない代わりに、
JDK 9
では、menuItem.putClientProperty("CheckBoxMenuItem.closeOnMouseClick", false);
などと設定することで、クリックしてもJPopupMenu
を閉じないようにすることが可能になる