Swing 如何防止选中其中的复选框时JPOppMenu消失?

Swing 如何防止选中其中的复选框时JPOppMenu消失?,swing,jcheckbox,jpopupmenu,Swing,Jcheckbox,Jpopupmenu,我想在jpopmenus中使用JCheckBoxMenuItems。它可以工作,但问题是当复选框项被选中或取消选中时,弹出菜单会消失。因此,如果想勾选/取消勾选多个项目,则需要反复启动弹出窗口,这令人恼火 奇怪的是,如果我只在菜单中使用普通的JCheckBox项(而不是JCheckBoxMenuItems),那么行为就像它应该的那样:弹出窗口保持在那里,复选框可以被选中/取消选中。完成后,只需在弹出窗口外部单击即可关闭弹出窗口 当存在JCheckBoxMenuItems项时,如何使弹出窗口的行为

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

奇怪的是,如果我只在菜单中使用普通的
JCheckBox
项(而不是
JCheckBoxMenuItem
s),那么行为就像它应该的那样:弹出窗口保持在那里,复选框可以被选中/取消选中。完成后,只需在弹出窗口外部单击即可关闭弹出窗口


当存在
JCheckBoxMenuItem
s项时,如何使弹出窗口的行为与之类似?我更喜欢使用JCheckBoxMenuItem,因为它们的外观。

嗯,从中找到了有效的答案。基本上,创建自定义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());

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

我遇到了一个关于Joonas Pulakka的回答的问题,因为“UIManager外观”被忽略了

我发现了下面的好把戏

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

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);
    }
}

“工作答案”指的是论坛sun com的链接,该链接已断开。有关此解决方案的其他信息可在此处找到:我认为这是一个bug,应由Swing库作者修复,而不是避免使用变通方法。唯一的问题是,Java开发人员宁愿找借口也不愿修复他们的bug。对我来说,在
jpopmenu
中使用时,这不起作用。引用文章作者的评论“此处提供的增强功能不适用于任何类型的弹出菜单。”