Discussion:
Java Swing: alle Elemente eines JFrames durchlaufen
(zu alt für eine Antwort)
Rainer
2018-11-28 17:36:03 UTC
Permalink
Hallo NG,

ich brauche ein wenig Unterstützung bei o. g .Aufgabe.

Ich habe hier
https://www.java-forum.org/thema/alle-elemente-eines-panels.92257/

eine Lösung gefunden, um den Text aller Textfelder zusetzen

Component[] components = xy.getComponents();
for(Component c : components) {
if(c instanceof JTextField) {
JTextField txf = (JTextField) c;
txf.setText("mein Text");
}

Das könnte ich sicherlich für meine Zwecke anpassen
(z. B. alle Optionsfelder ein- oder ausschalten, etc.)

Nur scheint das o. g. Beispiel für AWT zu passen.

Wie lautet eine Version für SWING? (javax.swing.JFrame)
Was muss ich z. B. anstelle von 'Component' verwenden?

Dake und Gruß
Rainer
Patrick Roemer
2018-11-28 21:46:41 UTC
Permalink
Post by Rainer
Ich habe hier
https://www.java-forum.org/thema/alle-elemente-eines-panels.92257/
eine Lösung gefunden, um den Text aller Textfelder zusetzen
Component[] components = xy.getComponents();
for(Component c : components) {
if(c instanceof JTextField) {
JTextField txf = (JTextField) c;
txf.setText("mein Text");
}
Das könnte ich sicherlich für meine Zwecke anpassen
(z. B. alle Optionsfelder ein- oder ausschalten, etc.)
Nur scheint das o. g. Beispiel für AWT zu passen.
Wie lautet eine Version für SWING? (javax.swing.JFrame)
Was muss ich z. B. anstelle von 'Component' verwenden?
Swing basiert auf AWT; alle Swing-Elemente sind auch AWT-Components. Da
JTextFields gesucht werden, zielt das Beispiel offenkundig auf Swing.

Dieser Code durchläuft allerdings nur die direkt enthaltenen
Komponenten. Üblicherweise hat man es aber mit einem Komponentenbaum zu
tun. Bei einem JFrame z.B. dürftest Du damit lediglich eine JRootPane
erwischen; Textkomponenten liegen tiefer. Du bräuchtest also noch eine
Art rekursiven Abstieg für gefundene (AWT-)Container, um überhaupt zu
Textfeldern vorzustoßen.

Bliebe noch die Frage, wozu man sowas überhaupt braucht. Um etwa
Checkboxes/RadioButtons (~ Optionsfelder?) gruppiert zu kontrollieren,
gibt es sicherlich bessere Möglichkeiten - z.B. sie gleich bei Erzeugung
in einer geeigneten Collection vorzuhalten.

Viele Grüße
Patrick
Rainer
2018-11-29 14:48:28 UTC
Permalink
On Wed, 28 Nov 2018 22:46:41 +0100, Patrick Roemer
Post by Patrick Roemer
Bliebe noch die Frage, wozu man sowas überhaupt braucht. Um etwa
Checkboxes/RadioButtons (~ Optionsfelder?) gruppiert zu kontrollieren,
gibt es sicherlich bessere Möglichkeiten - z.B. sie gleich bei Erzeugung
in einer geeigneten Collection vorzuhalten.
Könnte ich dazu ein Code-Beispiel haben?

Rainer
Patrick Roemer
2018-11-30 13:38:56 UTC
Permalink
Post by Rainer
On Wed, 28 Nov 2018 22:46:41 +0100, Patrick Roemer
Post by Patrick Roemer
Bliebe noch die Frage, wozu man sowas überhaupt braucht. Um etwa
Checkboxes/RadioButtons (~ Optionsfelder?) gruppiert zu kontrollieren,
gibt es sicherlich bessere Möglichkeiten - z.B. sie gleich bei Erzeugung
in einer geeigneten Collection vorzuhalten.
Könnte ich dazu ein Code-Beispiel haben?
Schwierig, wenn man nicht genau weiß, was Du eigentlich erreichen
willst. Im simpelsten Fall sowas:

<snip>
import javax.swing.*;
import java.awt.FlowLayout;
import java.awt.event.*;
import java.util.*;
import java.util.stream.*;
import static java.util.stream.Collectors.*;

public class JavaSwingCheck {

public static void main(String[] args) {
SwingUtilities.invokeLater(JavaSwingCheck::buildUI);
}

private static void buildUI() {
JFrame frame = new JFrame("Check");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(new FlowLayout());
List<JCheckBox> checks =
Stream.of("A", "B", "C").map(JCheckBox::new).collect(toList());
checks.forEach(c -> frame.getContentPane().add(c));
Action action = new AbstractAction("Off!") {
@Override public void actionPerformed(ActionEvent e) {
checks.forEach(c -> c.setSelected(false));
}
};
JButton button = new JButton(action);
frame.getContentPane().add(button);
frame.pack();
frame.setVisible(true);
}
}
</snip>

In einer echten, komplexeren Applikation würde man eh ein
Ordnungsprinzip für die UI-Logik haben wollen (MVC, Presentation
Model,...), und da gäbe es dann jeweils "natürliche" Stellen, an die
derartige Logik hingehört.

Viele Grüße
Patrick

Rainer
2018-11-29 14:54:41 UTC
Permalink
On Wed, 28 Nov 2018 22:46:41 +0100, Patrick Roemer
Post by Patrick Roemer
Dieser Code durchläuft allerdings nur die direkt enthaltenen
Komponenten. Üblicherweise hat man es aber mit einem Komponentenbaum zu
tun.
Ok, trotzdem würde ich den Code testen, allein um etwas zu lernen.

Ich scheitere aber an der 1. Zeile
Component[] components = xy.getComponents();

Welches Objekt statt xy müsste ich hier einsetzen?

Rainer
Rainer
2018-11-29 15:45:12 UTC
Permalink
Post by Rainer
On Wed, 28 Nov 2018 22:46:41 +0100, Patrick Roemer
Welches Objekt statt xy müsste ich hier einsetzen?
OK, das hat sich erledigt, so geht's

Component[] components = getContentPane().getComponents();
for (Component c : components) {
if (c instanceof javax.swing.JCheckBox) {
javax.swing.JCheckBox chkbox = (javax.swing.JCheckBox) c;
chkbox.setSelected(false);
}
}
Lesen Sie weiter auf narkive:
Loading...