# Eingabe in Textfeld soll Button aktivieren...



## XFlipX (5. Jan 2010)

Hallo,

habe folgendes Problem:

Ich habe einen Settings-Dialog, in dem verschiedene Einstellungen vorgenommmen werden können. Im unteren Teil des Dialogs befinden sich 3 Buttons (O.K.|Cancel|Apply)

O.K-Button -> Übernahme der Einstellungen und Schließen des Dialogs
Cancel-Button -> keine Übernahme und Schließen des Dialogs
Apply-Button -> nur Übernahme der Einstellungen

....mit Übernahme meine ich, die Einstellungen werden in der Registry abgespeichert.

Der Apply-Button is standardmäßig inaktiv -> er soll erst aktiv werden, wenn Einstellungen neu gesetzt wurden (Neusetzen von Text in den Textfeldern / Einträge in die Tabelle vorgenommen wurden)

Meine Frage, gibt es dafür einen speziellen Listener von JTextField, der mir bescheid gibt, wenn Text eingegeben wurde bzw. neu gesetzt wurde ?

Danke,XFlipX

Ps.: Noch nachträglich ein frohes neues Jahr!


----------



## javimka (5. Jan 2010)

Du könntest einen KeyListener verwenden. Erstelle einen einzigen und hänge ihn jedem Textfeld an. Wenn irgendwo eine Taste gedrückt wird, wird der Listener sofoort ausgelöst und du kannst deinen Button aktivieren.


----------



## XFlipX (5. Jan 2010)

Danke für den Tipp - es ist nur so, dass bei manchen TextFeldern der Text vom Nutzer nicht direkt eingetippt wird, sondern der Nutzer wählt über einen Datei/Verzeichniss-Auswahl-Dialog entsprechend aus und der ausgewählte Pfad wird als Text ins Textfeld gesetzt.

XFlipX


----------



## javimka (5. Jan 2010)

Dann könntest du z.B. eine neue Klasse machen, die von TextField erbt und setTest überschreibt und darin dann macht, was du willst.

Noch besser, wenn es möglich ist, wäre wohl, weitere Listener den AuswahlDialogen anzuhängen.

Aber wenn durch solch einen Dialog eine Auswahl gemacht wird, musst du dort doch sowieso etwas gecoded haben, was dann wirklich den Text im Textfeld setzt. Dort kannst du ja auch gleich noch einprogrammieren, dass der Button aktiviert wird.


----------



## Gast2 (6. Jan 2010)

XFlipX hat gesagt.:


> Hallo,
> 
> habe folgendes Problem:
> 
> ...



du kannst auf das Textfeld einen DocumentListener registrieren der sagt dir ob etwas inserted oder
removed wurde...


----------



## Dit_ (6. Jan 2010)

Hallo
ist es möglich in einer Klasse mit mehreren TextFeldern einen DocumentListener zu verwenden?

bei ActionListener kann ich ja unterscheiden zB so:


```
@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getSource().equals(saveButton)) {
			save();

		} else if (e.getSource().equals(cancelButton)) {
			closeWindow();
		}
	}
```

Mit DocumentListener geht das nicht, konnte im Netz keine Lösung finden... hat jemand nen Tipp für mich?

Danke schon mal!


----------



## Gast2 (6. Jan 2010)

Weiß zwar nicht für was du es brauchst, kannst ja einfach für jedes Textfeld einen eigenen anonymen Listener erstellen ist doch kein Problem? Oder was spricht dagegen?


----------



## Dit_ (6. Jan 2010)

na ja in einem Programm kann ich ein Fenster Einstellungen aufrufen. ZB wenn ich Tab "Verbindung und Passwörter" auswaehle, so habe ich 8 TextFelder mit UserName, Pw, proxy usw. wenn der User eine Eintrag ändert muss doch mein Feld irgendwie reagieren.

Wenn ich für alle extra Listener anlege dann sind es 8 x 3 neue Methoden die zusätzlich implementiert werden müssen. Mit einem könnte ich halt alle kompakt implementieren.

Aber wenn es nicht so leicht wie beim ActionListener geht dann muss ich wohl doch anonyme Listener implementieren..


----------



## Gast2 (6. Jan 2010)

Dit_ hat gesagt.:


> na ja in einem Programm kann ich ein Fenster Einstellungen aufrufen. ZB wenn ich Tab "Verbindung und Passwörter" auswaehle, so habe ich 8 TextFelder mit UserName, Pw, proxy usw. wenn der User eine Eintrag ändert muss doch mein Feld irgendwie reagieren.
> 
> Wenn ich für alle extra Listener anlege dann sind es 8 x 3 neue Methoden die zusätzlich implementiert werden müssen. Mit einem könnte ich halt alle kompakt implementieren.
> 
> Aber wenn es nicht so leicht wie beim ActionListener geht dann muss ich wohl doch anonyme Listener implementieren..



Versteh ich nicht warum du 8*3 neue Metoden machen musst... Kannst du ein Bsp machen?
Du hast halt 8 annoyme Listener die 8 mal die gleiche Methode ausführen... Ansonsten hättest du halt 8 ifs oder ein kompaktes if die jedes mal die gleiche Methode aufrufen???:L...

du könntest eventuell mit 
	
	
	
	





```
e.getDocument
```
 abfragen welches Textfeld gerade an der Reihe ist...


----------



## Dit_ (6. Jan 2010)

ok Beispiel


```
ipFieldSettings = new JTextField();
ipFieldSettings.getDocument().addDocumentListener(new DocumentListener() {
				private void checkIt(){
					if (serverIPOld != ipFieldSettings.getText()) {
						macheWas();
					} else {
						macheWasAnderes();
					}
				}
				@Override
				public void removeUpdate(DocumentEvent e) {
					checkIt();
				}
				
				@Override
				public void insertUpdate(DocumentEvent e) {
					checkIt();
				}
				
				@Override
				public void changedUpdate(DocumentEvent e) {}
			});


portFieldSettings = new JTextField();
portFieldSettings.getDocument().addDocumentListener(new DocumentListener() {
				
				private void checkIt(){
					
						if (ftpPortOld != portFieldSettings.getText()) {
								macheWas();
					} else {
						macheWasAnderes();
					}
				}
				
				
				@Override
				public void removeUpdate(DocumentEvent e) {
					checkIt();
					
				}
				
				@Override
				public void insertUpdate(DocumentEvent e) {
					checkIt();
				}
				
				@Override
				public void changedUpdate(DocumentEvent e) {}
...
pwSettings = new JTextField();
...
usw...
```


----------



## Gast2 (6. Jan 2010)

Dit_ hat gesagt.:


> ok Beispiel
> 
> 
> ```
> ...



Ja gut und was wär der Unterschied wenn du rausfinden könntest welches textfeld es wäre?


----------



## Dit_ (6. Jan 2010)

zB so:


```
@Override
                public void removeUpdate(DocumentEvent e) {
                        // e => changedObjekt             
              
                    if(changedObject.equals(ipFieldSettings){
                       if (serverIPOld != ipFieldSettings.getText()) {
                          macheWas();
                       } else {
                          macheWasAnderes();
                       }

                    } else if (changedObject.equals(portFieldSettings ){
                       ...
                    }
                    
                }
                
                @Override
                public void insertUpdate(DocumentEvent e) {
                    removeUpdate(e);
                }
                
                @Override
                public void changedUpdate(DocumentEvent e) {}
```

So hätte ich halt alles in einem Listener und könnte in meiner Klasse *implements DocumentListener* einfügen.


----------



## Gast2 (6. Jan 2010)

Dit_ hat gesagt.:


> zB so:
> 
> 
> ```
> ...



Naja erkenn jetzt keinen gravierenden Vorteil .Du hast jede Menge ifs drin...
Also ich würde 1. in diesem Listener nie auf das Textfeld zugreifen dafür gibts die methode e.getDocument().getText()... 
Und 2tens mir außerhalb die checkMethode machen und zwar check(String,Document)
und dann kann diese Methode jeder Listener verwenden und gut ist... und wenn dann auch noch die 2 methoden machWas und machWasAnderes für alle gleich sind dann ist es ja perfekt...


----------

