代码之家  ›  专栏  ›  技术社区  ›  Joonas Pulakka

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

  •  9
  • Joonas Pulakka  · 技术社区  · 14 年前

    JCheckBoxMenuItem 在一个 JPopupMenu

    奇怪的是,如果我用普通的 JCheckBox JCheckBoxMenuItem公司

    我如何使弹出窗口的行为像这样时,有项目 JCheckBoxMenuItem公司 JCheckBoxMenuItem公司 因为他们的长相。

    2 回复  |  直到 14 年前
        1
  •  12
  •   Joonas Pulakka    14 年前

    嗯,找到了有效的答案 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());
    

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

        2
  •  3
  •   FabiF    10 年前

    我遇到了一个问题,与尼斯乔纳斯普拉卡的答案,因为“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);
        }
    }