如何防止JPopupMenu的在它检查复选框时消失?

问题描述:

我想在JPopupMenu使用JCheckBoxMenuItem秒。它可以工作,但问题在于当复选框项目已被选中或未选中时,弹出菜单消失。因此,如果想要检查/取消选中几个项目,弹出窗口需要重复启动,这是令人烦恼的。奇怪的是,如果我在菜单中使用普通的JCheckBox项(而不是JCheckBoxMenuItem s),其行为与其应该一样:弹出窗口保留在此处,复选框可以选中/取消选中。完成后,弹出窗口可以通过点击外部来关闭。如何防止JPopupMenu的在它检查复选框时消失?

如何让我的弹出会那样,当项目有JCheckBoxMenuItem S'我宁愿使用,因为他们的长相JCheckBoxMenuItem秒。

+0

我认为这是一个错误,应该由Swing库作者修复,而不是避免使用替代方法。唯一的问题是,Java开发人员宁愿找到解决问题的借口。 – 2015-03-15 21:57:40

好,发现工作回答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()); 

不知道这是最优雅的可能的解决方案,但完美的作品。

+0

“工作答案”指的是链接到论坛太阳COM在被折断 – gnat 2011-10-13 11:02:38

+1

幸运的是,我在这里把它抄了! – 2011-10-13 11:09:09

+1

有关此解决方案的更多信息,请访问:http://www.coderanch.com/t/497325/GUI/java/keep-popup-while-clicking-JCheckBoxMenuItem – Steven 2011-10-21 21:28:54

我遇到了不错的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); 
    } 
}