如何在勾选 JPopUpMenu 中的复选框时防止其消失?

10
我想在JPopupMenu中使用JCheckBoxMenuItem。 它可以工作,但问题是当复选框被选中或取消选中时,弹出菜单会消失。 因此,如果一个人想要检查/取消检查多个项目,则需要反复启动弹出窗口,这很烦人。
奇怪的是,如果我在菜单中使用普通的JCheckBox项(而不是JCheckBoxMenuItem),行为就像应该的那样:弹出窗口保持在那里,复选框可以被选中/取消选中。 一旦完成,可以通过在外部单击来关闭弹出窗口。
当那里的项目是JCheckBoxMenuItem时,如何使弹出窗口表现得像那样? 我更喜欢使用JCheckBoxMenuItem,因为它们的外观。

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Tomáš Zato
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());

不知道这是否是最优雅的解决方案,但它完美地工作。


“working answer” 指向的论坛 sun com 的链接已经失效。 - gnat
1
此解决方案的更多信息可以在此处找到:http://www.coderanch.com/t/497325/GUI/java/keep-popup-while-clicking-JCheckBoxMenuItem - Steven

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

对我来说,在JPopupMenu中使用它并不起作用。引用文章评论中的作者:“这里提供的增强功能并不打算与任何类型的弹出菜单一起使用。” - qqilihq

1
我为这个问题找到了一个更简单的解决方案。
JCheckBoxMenuItem menuItem = new JCheckBoxMenuItem("sample");
menuItem.putClientProperty("CheckBoxMenuItem.doNotCloseOnMouseClick", Boolean.TRUE);

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

BasicMenuItemUI.doNotCloseOnMouseClick()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接