JCheckBoxMenuItemをクリックしてもJPopupMenuを閉じないように設定する
Total: 5308, Today: 2, Yesterday: 0
Posted by aterai at
Last-modified:
Summary
JPopupMenuにクリックしてもポップアップが開いたままの状態を維持するように設定したJCheckBoxMenuItemやJCheckBoxを追加します。
Screenshot

Advertisement
Source Code Examples
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, KotlinDescription
JCheckBoxJPopupMenuにJCheckBoxを追加- クリックしてもポップアップは閉じないが、マウスカーソルが乗ってもハイライト表示されない
JMenuItem + JCheckBoxJCheckBoxを配置したタイトルが空のJMenuItemを作成してJPopupMenuに追加JCheckBoxへのマウスイベント(MOUSE_DRAGGED,MOUSE_ENTERED,MOUSE_EXITED,MOUSE_MOVED)を親のJMenuItemに転送してハイライトを描画JCheckBoxへのマウスクリックイベント(MOUSE_CLICKED,MOUSE_PRESSED,MOUSE_RELEASEDなど)はブロックしてポップアップは閉じないように設定
JCheckBoxMenuItem- デフォルトの
JCheckBoxMenuItemをクリックするとポップアップは閉じる
- デフォルトの
keeping open #1JCheckBoxMenuItemにActionを追加してクリック後にポップアップを再度開くように設定JPopupMenuがJFrameの外に表示される場合はポップアップが一瞬消える
keeping open #2JCheckBoxMenuItemにBasicCheckBoxMenuItemUI#doClick(MenuSelectionManager)メソッドをオーバーライドしたCheckBoxMenuItemUIを設定- このイベントでクリック後にポップアップを閉じない代わりに
menuItem.doClick(0);でチェック状態のみ変更する - 参考: swing - How to prevent JPopUpMenu disappearing when checking checkboxes in it? - Stack Overflow
- このイベントでクリック後にポップアップを閉じない代わりに
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