在检查复选框时如何防止JPopUpMenu消失?

时间:2010-09-21 10:26:40

标签: swing jcheckbox jpopupmenu

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

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

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

2 个答案:

答案 0 :(得分: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());

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

答案 1 :(得分: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);
    }
}