Swing/StayOpenCheckBoxMenuItem のバックアップの現在との差分(No.5)
- 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 href: https://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);
// 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
で、クリックするとポップアップは閉じる - デフォルトの
JCheckBoxMenuItem
をクリックするとポップアップは閉じる
- デフォルトの
keeping open #1
-
JCheckBoxMenuItem
にAction
を追加して、クリック後にポップアップを再度開くように設定 -
JPopupMenu
がJFrame
の外に表示される場合は、ポップアップが一瞬消える -
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
- このイベントでクリック後にポップアップを閉じない代わりに
menuItem.doClick(0);
でチェック状態のみ変更する - 参考: swing - How to prevent JPopUpMenu disappearing when checking checkboxes in it? - Stack Overflow
- このイベントでクリック後にポップアップを閉じない代わりに、
-
JDK 9
では、menuItem.putClientProperty("CheckBoxMenuItem.closeOnMouseClick", false);
などと設定することで、クリックしてもJPopupMenu
を閉じないようにすることが可能になる -
Java 9
では、menuItem.putClientProperty("CheckBoxMenuItem.closeOnMouseClick", false);
menuItem.putClientProperty("CheckBoxMenuItem.doNotCloseOnMouseClick", true);
などと設定することで、対象のJCheckBoxMenuItem
をクリックしても親のJPopupMenu
は閉じなくなる-
UIManager.put("CheckBoxMenuItem.doNotCloseOnMouseClick", true)
で全体のJCheckBoxMenuItem
に適用可能 - 参考: JDK-8165234 Provide a way to not close toggle menu items on mouse click on component level - Java Bug System
-
参考リンク
- swing - How to prevent JPopUpMenu disappearing when checking checkboxes in it? - Stack Overflow
- swing - How to prevent JPopUpMenu disappearing when checking checkboxes in it? - Stack Overflow