2010-09-21 64 views
9

我想在JPopupMenu使用JCheckBoxMenuItem秒。它可以工作,但問題在於當複選框項目已被選中或未選中時,彈出菜單消失。因此,如果想要檢查/取消選中幾個項目,彈出窗口需要重複啓動,這是令人煩惱的。奇怪的是,如果我在菜單中使用普通的JCheckBox項(而不是JCheckBoxMenuItem s),其行爲與其應該一樣:彈出窗口保留在此處,複選框可以選中/取消選中。完成後,彈出窗口可以通過點擊外部來關閉。如何防止JPopupMenu的在它檢查複選框時消失?

如何讓我的彈出會那樣,當項目有JCheckBoxMenuItem S'我寧願使用,因爲他們的長相JCheckBoxMenuItem秒。

+0

我認爲這是一個錯誤,應該由Swing庫作者修復,而不是避免使用替代方法。唯一的問題是,Java開發人員寧願找到解決問題的藉口。 – 2015-03-15 21:57:40

回答

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

不知道這是最優雅的可能的解決方案,但完美的作品。

+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

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); 
    } 
} 
相關問題