JCheckBoxMenuItemをクリックしてもJPopupMenuを閉じないように設定する
Total: 4777
, Today: 2
, Yesterday: 1
Posted by aterai at
Last-modified:
概要
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
- このイベントでクリック後にポップアップを閉じない代わりに
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