Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > de.comp.lang.java > #13221 > unrolled thread

Java Swing: alle Elemente eines JFrames durchlaufen

Started byRainer <Rainer.Poop@Rcpt.at>
First post2018-11-28 18:36 +0100
Last post2018-11-29 16:45 +0100
Articles 6 — 2 participants

Back to article view | Back to de.comp.lang.java


Contents

  Java Swing: alle Elemente eines JFrames durchlaufen Rainer <Rainer.Poop@Rcpt.at> - 2018-11-28 18:36 +0100
    Re: Java Swing: alle Elemente eines JFrames durchlaufen Patrick Roemer <sangamon@netcologne.de> - 2018-11-28 22:46 +0100
      Re: Java Swing: alle Elemente eines JFrames durchlaufen Rainer <Rainer.Poop@Rcpt.at> - 2018-11-29 15:48 +0100
        Re: Java Swing: alle Elemente eines JFrames durchlaufen Patrick Roemer <sangamon@netcologne.de> - 2018-11-30 14:38 +0100
      Re: Java Swing: alle Elemente eines JFrames durchlaufen Rainer <Rainer.Poop@Rcpt.at> - 2018-11-29 15:54 +0100
        Re: Java Swing: alle Elemente eines JFrames durchlaufen Rainer <Rainer.Poop@Rcpt.at> - 2018-11-29 16:45 +0100

#13221 — Java Swing: alle Elemente eines JFrames durchlaufen

FromRainer <Rainer.Poop@Rcpt.at>
Date2018-11-28 18:36 +0100
SubjectJava Swing: alle Elemente eines JFrames durchlaufen
Message-ID<90ktvdt94icmm7d1vk9nrakimqstaa0ojo@4ax.com>
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

[toc] | [next] | [standalone]


#13222

FromPatrick Roemer <sangamon@netcologne.de>
Date2018-11-28 22:46 +0100
Message-ID<ptn2c1$6h9$1@newsreader4.netcologne.de>
In reply to#13221
Responding to 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

[toc] | [prev] | [next] | [standalone]


#13224

FromRainer <Rainer.Poop@Rcpt.at>
Date2018-11-29 15:48 +0100
Message-ID<9vuvvdtqjv4rp1rcehsk50jhcek69rgbbv@4ax.com>
In reply to#13222
On Wed, 28 Nov 2018 22:46:41 +0100, Patrick Roemer
<sangamon@netcologne.de> wrote:

>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

[toc] | [prev] | [next] | [standalone]


#13227

FromPatrick Roemer <sangamon@netcologne.de>
Date2018-11-30 14:38 +0100
Message-ID<ptrehg$bbd$1@newsreader4.netcologne.de>
In reply to#13224
Responding to Rainer:
> On Wed, 28 Nov 2018 22:46:41 +0100, Patrick Roemer
> <sangamon@netcologne.de> wrote:
>>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

[toc] | [prev] | [next] | [standalone]


#13225

FromRainer <Rainer.Poop@Rcpt.at>
Date2018-11-29 15:54 +0100
Message-ID<24vvvdpmr3rh2a6ngfhucigojp5ssok8v7@4ax.com>
In reply to#13222
On Wed, 28 Nov 2018 22:46:41 +0100, Patrick Roemer
<sangamon@netcologne.de> wrote:
 
>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

[toc] | [prev] | [next] | [standalone]


#13226

FromRainer <Rainer.Poop@Rcpt.at>
Date2018-11-29 16:45 +0100
Message-ID<u9200etctq297fml46nr2u2gmci0ob09a5@4ax.com>
In reply to#13225
On Thu, 29 Nov 2018 15:54:41 +0100, Rainer <Rainer.Poop@Rcpt.at>
wrote:

>On Wed, 28 Nov 2018 22:46:41 +0100, Patrick Roemer
><sangamon@netcologne.de> wrote:
> 

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

[toc] | [prev] | [standalone]


Back to top | Article view | de.comp.lang.java


csiph-web