2017-07-05 4 views
1

Ich verwende die javax.swing Bibliothek, und ich versuche, dieses Problem zu lösen:Java - Wählen Sie alle Artikel im Menü

Ich habe ein MenuBar, in dem ich JMenu erstellt, wird dieses Menü hat JCheckBoxMenuItem Artikel. Wie folgt aus:

//creating objects: 

jMenuBar = new javax.swing.JMenuBar(); 
jMenuAlgorithms = new javax.swing.JMenu(); 
jCheckBoxSPEA = new javax.swing.JCheckBoxMenuItem(); 
jCheckBoxNSGAII = new javax.swing.JCheckBoxMenuItem(); 
jSeparator1 = new javax.swing.JPopupMenu.Separator(); 
jCheckBoxMenuEnableAll = new javax.swing.JCheckBoxMenuItem(); 
jCheckBoxMenuDisableAll = new javax.swing.JCheckBoxMenuItem(); 

//settings and putting them together: 
jCheckBoxSPEA.setSelected(true); 
jCheckBoxSPEA.setText("SPEA"); 
jMenuAlgorithms.add(jCheckBoxSPEA); 

jCheckBoxNSGAII.setSelected(true); 
jCheckBoxNSGAII.setText("NSGAII"); 
jMenuAlgorithms.add(jCheckBoxNSGAII); 
jMenuAlgorithms.add(jSeparator1); 

jCheckBoxMenuEnableAll.setSelected(true); 
jCheckBoxMenuEnableAll.setText("Enable all"); 
jCheckBoxMenuEnableAll.addMouseListener(new java.awt.event.MouseAdapter() { 
     public void mouseClicked(java.awt.event.MouseEvent evt) { 
      jCheckBoxMenuEnableAllMouseClicked(evt); 
     } 
    }); 
jMenuAlgorithms.add(jCheckBoxMenuEnableAll); 

jCheckBoxMenuDisableAll.setText("Disable all"); 
jMenuAlgorithms.add(jCheckBoxMenuDisableAll); 

jMenuBar.add(jMenuAlgorithms); 

Wenn der Benutzer jCheckBoxMenuEnableAll Element auswählt, würde Ich mag alle Elemente über dem Separator wählen. Wenn er jCheckBoxMenuDisableAll auswählt, möchte ich alle Elemente über dem Trennzeichen abwählen.

Wie Sie sehen können, habe ich mouseClicked Aktion auf den jCheckBoxMenuEnableAll Artikel hinzugefügt. Nun, ich möchte so etwas tun:

private void jCheckBoxMenuEnableAllMouseClicked(java.awt.event.MouseEvent evt) { 

    for(JCheckBoxMenuItem item : jMenuAlgorithms){ 
     item.setSelected(true); 
    } 
    //deselect then jCheckBoxMenuDisableAll, it's not essential for instance 
} 

Aber anscheinend kann ich nicht, wie dies für Schleife tun, wie der Menüpunkt nicht ein array oder Iterable ist.

Nun, nur zum Testen, ich hatte etwas sehr dumm (Code unten) - ich gebe alle Elemente im Menü, und wenn das Element ein Kontrollkästchen ist, mache ich seine Kopie, setzen Sie Wert auf "wahr "(ausgewählt) und ersetzen Sie das Originalelement durch seine Kopie. Sehr dumm, ich weiß und ich möchte das absolut nicht tun, aber ich habe keinen anderen Weg gefunden, es zu tun. Ich wollte nur sehen, ob das funktioniert. Ich vermutete es sollte, aber es stoll funktioniert nicht. Was mache ich falsch? Vielen Dank für Ihre Zeit.

private void jCheckBoxMenuEnableAllMouseClicked(java.awt.event.MouseEvent evt) {              

    if(jCheckBoxMenuEnableAll.isSelected()){ 
     for(int i =0; i< jMenuAlgorithms.getItemCount(); i++){ //for all items in the menu, separators included 
      if(jMenuAlgorithms.getItem(i) instanceof JCheckBoxMenuItem){ 
       JCheckBoxMenuItem item = ((JCheckBoxMenuItem)jMenuAlgorithms.getItem(i)); 
       item.setSelected(true); 
       jMenuAlgorithms.insert(item, i); 
      } 
     } 
    } 

}    
+1

Für eine bessere Hilfe früher, Posten [MCVE] oder [Kurz, Self Contained, Korrekt Beispiel] (http://www.sscce.org/). –

Antwort

2
  • Ich denke, JPopupMenu#getSubElements() ist das, was Sie suchen.
    • siehe auch: JMenu#getSubElements()

      Gibt einen Array von MenuElements das Untermenü für dieses Menü Komponente enthält. Wenn das Popup-Menü null ist, wird ein leeres Array zurückgegeben. Diese Methode muss der MenuElement-Schnittstelle entsprechen. Beachten Sie, dass JSeparators nicht der MenuElement-Schnittstelle entsprechen. Dieses Array enthält nur JMenuItems.

import java.awt.*; 
import java.util.Arrays; 
import java.util.stream.Stream; 
import javax.swing.*; 

public class MenuSubElementsTest { 
    public JComponent makeUI() { 
    JMenu jMenuAlgorithms = new JMenu("MenuAlgorithms"); 

    JMenuItem jCheckBoxMenuEnableAll = new JMenuItem("Enable all"); 
    jCheckBoxMenuEnableAll.addActionListener(e -> { 
     for (MenuElement me: jMenuAlgorithms.getPopupMenu().getSubElements()) { 
     System.out.println("debug1: " + me.getClass().getName()); 
     if (me instanceof JCheckBoxMenuItem) { 
      ((JCheckBoxMenuItem) me).setSelected(true); 
     } 
     } 
     //or: getJCheckBoxMenuItem(jMenuAlgorithms).forEach(r -> r.setSelected(true)); 
    }); 

    JMenuItem jCheckBoxMenuDisableAll = new JMenuItem("Disable all"); 
    jCheckBoxMenuDisableAll.addActionListener(e -> { 
     getJCheckBoxMenuItem(jMenuAlgorithms).forEach(r -> r.setSelected(false)); 
    }); 

    jMenuAlgorithms.add(new JCheckBoxMenuItem("SPEA", true)); 
    jMenuAlgorithms.add(new JCheckBoxMenuItem("NSGAII", true)); 
    jMenuAlgorithms.addSeparator(); 
    jMenuAlgorithms.add(jCheckBoxMenuEnableAll); 
    jMenuAlgorithms.add(jCheckBoxMenuDisableAll); 

    JMenuBar jMenuBar = new JMenuBar(); 
    jMenuBar.add(jMenuAlgorithms); 

    JPanel p = new JPanel(new BorderLayout()); 
    p.add(jMenuBar, BorderLayout.NORTH); 
    return p; 
    } 
    private static Stream<JCheckBoxMenuItem> getJCheckBoxMenuItem(MenuElement p) { 
    Class<JCheckBoxMenuItem> clz = JCheckBoxMenuItem.class; 
    return stream(p).filter(clz::isInstance).map(clz::cast); 
    } 
// public static Stream<MenuElement> stream(MenuElement p) { 
//  return Arrays.stream(p.getSubElements()) 
//  .map(MenuSubElementsTest::stream).reduce(Stream.of(p), Stream::concat); 
// } 
    public static Stream<MenuElement> stream(MenuElement p) { 
    return Stream.concat(Stream.of(p), Arrays.stream(p.getSubElements()) 
     .peek(me -> System.out.println("debug2: " + me.getClass().getName())) 
     .flatMap(MenuSubElementsTest::stream)); 
    } 
    public static void main(String... args) { 
    EventQueue.invokeLater(() -> { 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     f.getContentPane().add(new MenuSubElementsTest().makeUI()); 
     f.setSize(320, 240); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    }); 
    } 
} 
Verwandte Themen