• 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: https://java-swing-tips.blogspot.com/2016/05/keep-visible-jpopupmenu-while-clicking.html
       lang: en

概要

JPopupMenuにクリックしてもポップアップが開いたままの状態を維持するように設定したJCheckBoxMenuItemJCheckBoxを追加します。

サンプルコード

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
    • JPopupMenuJCheckBoxを追加
    • クリックしてもポップアップは閉じないが、マウスカーソルが乗ってもハイライト表示されない
  • 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
    • JCheckBoxMenuItemActionを追加してクリック後にポップアップを再度開くように設定
    • JPopupMenuJFrameの外に表示される場合はポップアップが一瞬消える
  • keeping open #2

参考リンク

コメント