2016-12-09 3 views
2

Ich entwickle eine kleine Anwendung mit Java und Swing und ich stehe vor einem Problem, das mich dazu bringen könnte, einen Teil davon von Grund auf neu zu machen.Iterate durch alle Checkboxen in Swing

In einem der Panels habe ich etwa 20 Checkboxen. Bis jetzt sind die Variablennamen jcheckbox1, jcheckbox2 usw. Ich muss alle durchlaufen und den Text der ausgewählten abrufen. Das Problem kommt mit der Tatsache, dass ich NetBeans verwendet habe, um meine GUI durch Ziehen und Ablegen der Elemente zu entwickeln, so wie ich sie brauchte, so dass meine Checkboxen nicht in einer Liste oder einem Array aggregiert sind. Gibt es eine Möglichkeit, alle Checkboxen auszuwählen und durchzulaufen, um den Textwert der überprüften zu erhalten?

Wenn nicht, wie soll ich sie so deklarieren, dass ich sie leicht durchlaufen kann? Ich glaube, eine Reihe von Checkboxen ist vielleicht nicht sehr schwer alleine zu machen, aber das Problem scheint darin zu liegen, alle in die richtige Position zu bringen. Ich benutze Gridbag mit zwei Spalten, wenn das hilft.

Danke!

+1

'Ich habe NetBeans verwendet, um meine GUI durch Ziehen und Ablegen der Elemente zu entwickeln, wie ich sie brauchte' - d Verwenden Sie nicht die IDE, um das Formular zu erstellen. Wie Sie sehen, ist es ein Problem für diese Frage und auch der Code ist nicht portierbar, wenn Sie jemals zu einer anderen IDE wechseln müssen. Stattdessen kodieren Sie das Formular selbst und verwenden Sie einen geeigneten Layout-Manager, um das gewünschte Layout zu erhalten. Der Code wird einfacher zu pflegen und zu verwenden sein. Beginnen Sie zum Beispiel mit dem Demo-Code von [How To Use GridLayout] (http://docs.oracle.com/javase/tutorial/uiswing/layout/grid.html). – camickr

Antwort

3

Bei einer Container, Sie alle untergeordneten Komponenten finden können, dann überprüfen, ob sie JCheckBox sind, und dann, wenn sie überprüft werden.

Das folgende Beispiel Verfahren ist aus How to get all elements inside a JFrame? inspiriert und an Ihre Bedürfnisse angepasst:

public static List<String> manageCheckedCheckboxes(final Container c) { 
    Component[] comps = c.getComponents(); 
    List<String> checkedTexts = new ArrayList<String>(); 

    for (Component comp : comps) { 

     if (comp instanceof JCheckBox) { 
      JCheckBox box = (JCheckBox) comp; 
      if (box.isSelected()) { 

       String text = box.getText(); 
       checkedTexts.add(text); 
      } 
     } 
    } 

    return checkedTexts; 

} 
+0

Dies funktionierte. Danke: D –

+0

Beachten Sie, dass die Antwort von @flakes auch korrekt ist, wenn Sie Java 8 verwenden. – Berger

0

NetBeans generieren Code zum Ziehen & Drop-Komponenten, so dass Sie sie manuell hinzufügen können, um Liste oder andere Sammlung und dann darüber zu iterieren.

+0

Wie? fügen Sie etwas mehr demonstrative –

1

Sie können durch die Komponenten in Ihrem Container iterieren und sehen, ob sie in Checkboxen umgewandelt werden können.

List<JCheckBox> checkboxes = Arrays.stream(container.getComponents()) 
    .filter(c -> c instanceof JCheckBox) 
    .map(JCheckBox.class::cast) 
    .collect(Collectors.toList()); 

List<String> selectedText = checkboxes.stream() 
    .filter(JCheckBox::isSelected) 
    .collect(Collectors.toList()); 

Für Spaß machte ich eine allgemeine rekursive Version für jede Komponente zu finden, die Sie benötigen:

public static <T extends JComponent> List<T> findComponents(
    final Container container, 
    final Class<T> componentType 
) { 
    return Stream.concat(
     Arrays.stream(container.getComponents()) 
      .filter(componentType::isInstance) 
      .map(componentType::cast), 
     Arrays.stream(container.getComponents()) 
      .filter(Container.class::isInstance) 
      .map(Container.class::cast) 
      .flatMap(c -> findComponents(c, componentType).stream()) 
    ).collect(Collectors.toList()); 
} 
0

Netbeans können noch benutzerdefinierten Code in dem Formularentwurf zu schreiben, alles, was Sie tun müssen, ist zu Quelle gehen, erstellen Sie ein Array von Kontrollkästchen.

Erstellen Sie ein Array, auf dem unteren Rand der Seite, wo andere Variablen finden: Create an array

initialisieren Array als:

Initialize array as

Später können Sie einfach über das Array iterieren

for(JCkeckBox cb: ckeckBoxes){ 
    // 
}