# DocumentListener auf mehrere Textfelder



## Camino (31. Jan 2010)

Hallo,

ich bin gerade dabei, mir einen Dialog in meiner Swing-Anwendung zu bauen, der drei Texteingabefelder (JTextField) und eine Ausgabeliste (zur Zeit JList, wird aber evtl. noch zur JTable) beeinhalten. Zum Start des (modalen) Dialogs werden von der Datenbank Daten in eine ArrayList geschrieben, die in der Ausgabeliste angezeigt werden. Mit den 3 Texteingabefeldern soll die Ausgabeliste gefiltert werden, d.h. sofort nach Eingabe eines Buchstabens soll die Liste mit den gefilterten Datensätzen angepasst werden. Ich hab jetzt erst mal auf ein Textfeld einen DocumentListener gelegt und nun eine Klasse MyDocumentListener, die DocumentListener implementiert. Dort sind die Methoden, die auf Änderung im Textfeld reagieren (insert, remove). Mit dem einen Textfeld klappt das mittlerweile auch. Nun möchte ich ja auf die restlichen beiden Textfelder auch den Listener legen. Wie kann ich denn erkennen, von welchem der drei Textfelder nun der Event ausgelöst wurde? Ich bekomme zwar das Dokument ausgegeben als javax.swing.text.PlainDocument@1c0bee6 (was ja eigentlich das Textfeld ist), aber wie kann ich von diesem getDocument den Namen des aufrufenden Textfeldes erkennen?

Als nächstes muss ich dann wohl einen Filter für die Ausgabeliste (also für die ArrayList) schreiben. Aber dazu melde ich mich dann wieder, wenn ich soweit bin...

Viele Grüsse
Camino


----------



## eRaaaa (31. Jan 2010)

Camino hat gesagt.:


> Ich bekomme zwar das Dokument ausgegeben als javax.swing.text.PlainDocument@1c0bee6 (was ja eigentlich das Textfeld ist), aber wie kann ich von diesem getDocument den Namen des aufrufenden Textfeldes erkennen?



So an sich garnicht. Du könntest das Document aber vergleichen, also 

getDocument == textfeld1.getDocument() , dann wüsstest du ja dass es vom ersten Textfeld kommen muss.

Oder man kann auch dem Document properties verpassen:

textfeld1.getDocument().putProperty("textfeld", textfeld1);

dann könntest du einfach im Listener

JTextField feld = (JTextField) e.getDocument().getProperty("textfeld"); aufrufen.

Ob das ein schöner Ansatz ist, würde ich selbst gerne von einem Swing-Guru erfahren =)


----------



## Camino (31. Jan 2010)

Also, ich hab jetzt mit


```
tfNachname.getDocument().addDocumentListener(new MyDocumentListener());
tfNachname.getDocument().putProperty("textfeldNachname", tfNachname);
```

dem Textfeld den Listener und die Property verpasst.

Aber wie kann ich nun im Listener (eine eigene Klasse, die DocumentListener implementiert) erkennen, welches Textfeld der Auslöser ist?

Mit

```
JTextField feld = (JTextField) e.getDocument().getProperty("textfeldNachname");
System.out.println(feld);
```
bekomme ich dann zwar das Textfeld als Objekt zurückgeliefert, aber ich will ja in der Funktion im Listener erkennen, welches Textfeld das war.

Viele Grüsse
Camino


----------



## eRaaaa (31. Jan 2010)

Naja das mit dem Property war nur ein Beispiel du kannst da jedes Objekt angeben. D.h. du könntest als Value halt auch einfach immer einen String mitgeben der dann z.B. den Namen beinhaltet oder was auch immer. Wofür/Wieso brauchst du das denn eig., vllt geht das auch viel einfacher


----------



## Camino (31. Jan 2010)

Na ja, wie ich schon geschrieben hatte, sollen die Eingaben in den Textfeldern die Ausgabeliste filtern. Also, wenn ich z.B. in das Textfeld für den Nachnamen ein 'F' eingebe, dann sollen nur noch die Datensätze angezeigt werden, deren Nachname mit dem Buchstaben 'F' anfangen. Das soll dann auch mit den anderen beiden Textfeldern kombinierbar sein. Also, in das Textfeld für die Vornamen dann ein 'A' eingegeben, soll die Ausgabeliste nach allen Nachnamen die mit 'F' anfangen UND deren Vornamen mit 'A' bginnen filtern. Die Daten in der Ausgabeliste kommen aus einer Datenbank und sind in einer ArrayList gespeichert.


----------



## Camino (31. Jan 2010)

OK, jetzt hab ich's kapiert:


```
tfNachname.getDocument().putProperty("name", "tfNachname");
```

Wird im Listener so erkannt:


```
Document doc = (Document)e.getDocument();
System.out.println(doc.getProperty("name"));
```

So kann ich dann erkennen, welches Textfeld der Auslöser war. Danke für die Hilfe...

Camino


----------

