# Textfeld auslesen und in Liste speichern



## wommers (15. Okt 2013)

Hallo, 

ich habe folgendes Problem:

Ich erstelle in einer for-Schleife mehrere Textfelder.
Ich möchte nun dass ich die Textfelder auslesen kann und zwar alle die ich in verschiedener Anzahl erstellt habe.Danach soll dies in eine Liste eingetragen werden und in einer Tabelle soll zum schluss alles ausgegeben werden.

Mit dem befehl:


```
String eingabe=textfield.getText();
```

bekomme ich nur das letzte Textfeld. Ich brauche aber alle die ich erstellt habe!

Nun meine Fragen:
Wie kann ich die Textfelder auslesen?
Wie schreibe ich den Text aus den Textfeldern in eine Liste?
Wie gebe ich diese Liste in einer Tabelle aus?

Hier mein bisheriger Quellcode:


```
public class SpielernameGUI extends JFrame {

	/**
		 * 
		 */
	private static final long serialVersionUID = 1L;

	int spielerAnz;

	public SpielernameGUI(String title, int spielerAnz) {
		super(title);
		setSize(400, 300);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.spielerAnz = spielerAnz;

		createGUI();
	}

	private void createGUI() {

		setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
		for (int i = 0; i < spielerAnz; i++) {
			int spielerNummer = i + 1;

			JTextField nameField = new JTextField("Name fŸr Spieler"
					+ spielerNummer);

			add(nameField, Component.CENTER_ALIGNMENT);

		}
		JButton tableButton = new JButton("Zur Tabelle");
		tableButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				TableGUI tGUI = new TableGUI("Tabellenansicht");
				tGUI.setVisible(true);

			}
		});
		add(tableButton, Component.CENTER_ALIGNMENT);
	}
}
```

Danke im Voraus!


----------



## chalkbag (15. Okt 2013)

Ich würde vorschlagen du lässt dir von deinem JFrame/Component alle Kinder mittels getComponents zurückgegeben. Dann prüfst du über instanceof, ob es sich hierbei um ein Textfeld handelt. Wenn du Panels ineinander schachtelst, musst du die Methode rekursiv umsetzten.

Hier ein Beispiel (ungetestet aus dem Netz), welches alle Elemente zusammen sammelt. Die Überprüfung auf das Textfeld fehlt hier noch.
Quelle: java - How to get all elements inside a JFrame? - Stack Overflow


```
public static List<Component> getAllComponents(final Container c) {
    Component[] comps = c.getComponents();
    List<Component> compList = new ArrayList<Component>();
    for (Component comp : comps) {
        compList.add(comp);
        if (comp instanceof Container)
            compList.addAll(getAllComponents((Container) comp));
    }
    return compList;
}
```

[EDIT] Alternativ könntest du die Textfelder natürlich auch direkt bei der Erstellung schon in einer Liste sammeln, auf welche du dann bei Bedarf zugreifen kannst.[/EDIT]


----------



## wommers (15. Okt 2013)

Hallo, erstmal danke für deine antwort. Leider bekomme ich das nicht so richtig hin  wäre über weitere vorschläge sehr dankbar. ggf. auch Beispiele! MfG


----------



## chalkbag (15. Okt 2013)

Naja, als Anfänger kann das ruhig länger als 15 Minuten brauchen


Was die von mir gezeigte Methode macht und wie diese aufgerufen wird, hast du verstanden?
Also fehlt dir nur, wie du nur Textfelder berücksichtigst?


----------



## wommers (15. Okt 2013)

Ja hab ich. Ich versuche es nochmal. Und wie gebe ich die Liste in die Tabelle?


----------



## chalkbag (15. Okt 2013)

Entschuldige, das war mir aus deiner Antwort nicht ersichtlich. 
Für eine Liste könntest du ein JList Panel verwenden.

Anbei zwei sehr gute Beispiele, welcher dir sicherlich helfen.

A simple JList example

How to Use Lists (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)

Viele Grüße


----------



## wommers (15. Okt 2013)

OK...also ich habe jetzt versucht es so zu machen wie oben beschrieben....leider bekomme ich es nicht so richtig hin und verstehe es auch nicht wirklich :/ kannst du mir zeigen wie es anhand meines quelltextes auszusehen hat?


----------



## Datacron (16. Okt 2013)

Hi,

hab lange nicht mehr mit Swing gearbeitet, aber so ca könnte es aussehen in deinem Code: 

```
private Vector eingaben = new Vector();
        String eingabe = textfield.getText();
        this.addElementToList(eingabe);
        
        public void addElementToList(String e) {
            eingaben.add(e);
        }
        
        JList ausgabeListe = new JList(eingaben);
```

Alle Texte die du in einem Textfeld eingibts könntest du in einer Variable speichern und der methode addElementToList weitergeben. Die fügt es dann deiner Liste hinzu. Bitte berichtigen wenn ichs falsch aufgenommen hab


----------



## wommers (16. Okt 2013)

OK, ja das sieht vielversprechend aus. Aber ich bekomme es einfach nicht hin die Eingaben der Textfelder auszulesen und diese dann über deine geschriebene Methode in eine Liste einzufügen.

Das ist derzeit mein größtest Problem.


```
public class SpielernameGUI extends JFrame {
     
        /**
             *
             */
        private static final long serialVersionUID = 1L;
     
        int spielerAnz;
     
        public SpielernameGUI(String title, int spielerAnz) {
            super(title);
            setSize(400, 300);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.spielerAnz = spielerAnz;
     
            createGUI();
        }
     
        private void createGUI() {
     
            setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
            for (int i = 0; i < spielerAnz; i++) {
                int spielerNummer = i + 1;
     
                JTextField nameField = new JTextField("Name fŸr Spieler"
                        + spielerNummer);
     
                add(nameField, Component.CENTER_ALIGNMENT);
     
            }
            JButton tableButton = new JButton("Zur Tabelle");
            tableButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    TableGUI tGUI = new TableGUI("Tabellenansicht");
                    tGUI.setVisible(true);
     
                }
            });
            add(tableButton, Component.CENTER_ALIGNMENT);
        }
    }
```

Am anfang steht ja "Name fŸr Spieler"+ spielerNummer" in allen Textfeldern.

Ich möchte dass ich dann erst den Text aus den Textfeldern nehme wenn ich auf den Button "Zur Tabelle" drücke.
Es muss sozusagen jede eingabe von jedem einzelnen Textfeld in eine nue Varable gespeichert werden und die muss dann der List hinzugefügt werden. Diese Liste soll es dann in einer Tabelle anzeigen.

MfG


----------



## grindelaner (16. Okt 2013)

> ch würde vorschlagen du lässt dir von deinem JFrame/Component alle Kinder mittels getComponents zurückgegeben.



Warum machst du es kompliziert, wenn es auch einfach geht?

Wenn du eine Liste an JTextField haben willst, dann definiere doch einfach eine Liste von JTextField(s).
Also: 

```
List<JTextField> liste = new ArrayList<JTextField>()
```
Du kannst so einfach ein TextFeld initialisieren in eine JComponenten adden und dann der Liste hinzufügen.

Also:

```
List<JTextField> liste = new ArrayList<JTextField>()

JTextField tf = new JTextField("text");
this.add(tf); //Ich bin in deinem Beispiel das JFrame...
liste.add(tf);
...
```

Über die Liste kannst du dann das JTextField ansprechen...
Wenn du dieses Element in der Liste änderst (z.B. tf.setText("asdlk")) wird dies automatisch in der UI mitgeändert...


----------



## Datacron (16. Okt 2013)

Du könntest textfelder in deiner schleife mit verschiedenen "ids" anlegen spielernummer = id da du sont denk ich mal probleme bekommen wirst mit den jtextFields, diese anzusprechen.


```
public class SpielernameGUI extends JFrame{

        private static final long serialVersionUID = 1L;
     
        int spielerAnz;
        private Vector eingaben;
        JTextField[] textFields;
        
        public SpielernameGUI(String title, int spielerAnz) {
            super(title);
            setSize(400, 300);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.spielerAnz = spielerAnz;
            this.eingaben = new Vector();
            createGUI();
        }
     
        private void createGUI() {
            
            
            int spielerNummer;

            setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
            for (int i = 0; i < spielerAnz; i++) {
                spielerNummer = i + 1;
                textFields[spielerNummer] = new JTextField("Name für Spieler" + spielerNummer);
                add(textFields[spielerNummer], Component.CENTER_ALIGNMENT);
            }

            JButton tableButton = new JButton("Zur Tabelle");
            tableButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    TableGUI tGUI = new TableGUI("Tabellenansicht");
                    tGUI.setVisible(true);
                    
                    for(int s = 0; s < textFields.length; s++) {
                	String name = textFields[s].getText();
                	addElementToList(name);
                    }
                }
            });
            add(tableButton, Component.CENTER_ALIGNMENT);
        }

        public void addElementToList(String e) {
            eingaben.add(e);
        }
       
        JList ausgabeListe = new JList(eingaben);
        

}
```


Oder wie grindelaner sagt :bae: die einzelnen Felder könntest dann mit dem jeweiligen index auslesen bei button druck


----------



## grindelaner (16. Okt 2013)

Es gibt so viele Möglichkeiten 

TextField in eine Map packen...
TextField in eine Klasse packen wo du noch mehr Attribute hinterlegen kannst....
TextField direkt über JComponent ansprechen.... (Nicht so gut )
...


----------

