2015-12-01 76 views
0

我附加了一些JCheckBoxMenuItems到我的JMenu來代替JMenuItem。當用戶點擊JMenu時,它顯示JCheckBoxMenuItems。一旦用戶從JCheckBoxMenuItem中選擇其中一個框,JCheckBoxMenuItems列表消失,即關閉。我如何覆蓋默認動作,以便它保持打開狀態(以便他們可以一次選擇/取消選擇多個框),直到用戶單擊JCheckBoxMenuItems之外的某個位置?如何防止JCheckBoxMenuItem單擊後關閉?

+0

這兩種方法我見過是,要麼實現自己的UI委託(不是一個真正的好的解決方案),或實現自己的'JMenuItem'並重寫'processMouseEvent',再次,不是很漂亮 – MadProgrammer

回答

6

我見過的兩個基本方法是讓你自己的用戶界面委託,這不是很漂亮,而且需要你爲每個想要支持的平臺提供一個用戶界面委託,或者覆蓋processMouseEventJMenuItem(或JCheckBoxMenuItem在你的情況)。

例如...

Static menu items

import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.MouseEvent; 
import javax.swing.Action; 
import javax.swing.Icon; 
import javax.swing.JCheckBoxMenuItem; 
import javax.swing.JFrame; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JMenuBar mb = new JMenuBar(); 
       JMenu menu = new JMenu("Lots-o-stuff"); 
       mb.add(menu); 

       menu.add(new MyMenuItem("Apples")); 
       menu.add(new MyMenuItem("Pears")); 
       menu.add(new MyMenuItem("Bananas")); 

       JFrame frame = new JFrame("Testing"); 
       frame.setJMenuBar(mb); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

    } 

    public class MyMenuItem extends JCheckBoxMenuItem { 

     public MyMenuItem() { 
     } 

     public MyMenuItem(Icon icon) { 
      super(icon); 
     } 

     public MyMenuItem(String text) { 
      super(text); 
     } 

     public MyMenuItem(Action a) { 
      super(a); 
     } 

     public MyMenuItem(String text, Icon icon) { 
      super(text, icon); 
     } 

     public MyMenuItem(String text, boolean b) { 
      super(text, b); 
     } 

     public MyMenuItem(String text, Icon icon, boolean b) { 
      super(text, icon, b); 
     } 

     @Override 
     protected void processMouseEvent(MouseEvent evt) { 
      if (evt.getID() == MouseEvent.MOUSE_RELEASED && contains(evt.getPoint())) { 
       doClick(); 
       setArmed(true); 
      } else { 
       super.processMouseEvent(evt); 
      } 
     } 
    } 

} 
+0

非常好的例子,謝謝! –

+0

這很酷......現在你可以讓它切換打開/關閉選中標記嗎? – geowar

+0

@geowar將呼叫更改爲setArmed – MadProgrammer