10

我想JCheckBoxMenuItem在 a 中使用 s JPopupMenu。它可以工作,但问题是当复选框项目被选中或取消选中时弹出菜单会消失。因此,如果要选中/取消选中多个项目,则需要反复启动弹出窗口,这很烦人。

奇怪的是,如果我只使用JCheckBox菜单中的普通项目(而不是JCheckBoxMenuItems),行为就应该是这样:弹出窗口停留在那里,并且可以选中/取消选中复选框。完成后,只需单击外部即可关闭弹出窗口。

当项目有 s 时,如何使弹出窗口表现得像这样JCheckBoxMenuItem?我更喜欢使用JCheckBoxMenuItems 因为它们的外观。

4

3 回答 3

12

好吧,从http://forums.sun.com/thread.jspa?threadID=5432911找到了有效的答案。基本上,创建一个自定义 UI:

public class StayOpenCheckBoxMenuItemUI extends BasicCheckBoxMenuItemUI {

   @Override
   protected void doClick(MenuSelectionManager msm) {
      menuItem.doClick(0);
   }

   public static ComponentUI createUI(JComponent c) {
      return new StayOpenCheckBoxMenuItemUI();
   }
}

并将其设置在JCheckBoxMenuItem

myJCheckBoxMenuItem.setUI(new StayOpenCheckBoxMenuItemUI());

不知道这是否是最优雅的解决方案,但效果很好。

于 2010-09-21T11:06:58.723 回答
3

我遇到了一个很好的 Joonas Pulakka 回答的问题,因为“UIManager lookandFeel”被忽略了。

我在http://tips4java.wordpress.com/2010/09/12/keeping-menus-open/上找到了下面的好技巧

关键是在菜单关闭后立即重新打开它,它是不可见的,并保持应用程序的外观和行为。

public class StayOpenCBItem extends JCheckBoxMenuItem {

    private static MenuElement[] path;

    {
        getModel().addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
                if (getModel().isArmed() && isShowing()) {
                    path = MenuSelectionManager.defaultManager().getSelectedPath();
                }
            }
        });
    }

    public StayOpenCBItem(String text) {
        super(text);
    }

    @Override
    public void doClick(int pressTime) {
        super.doClick(pressTime);
        MenuSelectionManager.defaultManager().setSelectedPath(path);
    }
}
于 2014-04-08T14:04:23.980 回答
1

我为这个问题找到了一个更简单的解决方案

JCheckBoxMenuItem menuItem = new JCheckBoxMenuItem("sample");
menuItem.putClientProperty("CheckBoxMenuItem.doNotCloseOnMouseClick", Boolean.TRUE);

我在阅读代码时找到了这个解决方案

BasicMenuItemUI.doNotCloseOnMouseClick()
于 2021-09-22T07:55:23.557 回答