# JTextField / DocumentListener



## km66 (3. Dez 2005)

Hallo!

Mein Problem:
Ich möchte, dass ein bestimmtes jTextfield2 verändert wird, 
wenn sich der Inhalt eines anderen jTextfield1 ändert.

Dazu brauche ich, wie ich inzwischen weiss, einen DocumentListener. 
---------------------------------------------------------------------------------

```
jTextField1.getDocument().addDocumentListener(this);
```

---------------------------------------------------------------------------------
und diese Methoden:
---------------------------------------------------------------------------------

```
public void changedUpdate(DocumentEvent de) {
    textValueChanged();
  }

  public void insertUpdate(DocumentEvent de) {
    textValueChanged();
  }

  public void removeUpdate(DocumentEvent de) {
    textValueChanged();
  }

  private void textValueChanged () {
     try {
       String text = jTextField1.getText();
       int Eingabewert = Integer.parseInt(text);
       int Ausgabewert = Eingabewert * 5;
       // System.out.println(Ausgabewert);
       jTextField2.setText(("" + Ausgabewert));
     }
     catch (NumberFormatException x) {
        //  irgendetwas
     }
     catch (Exception x) {
       //  irgendetwas
     }
  }
```
---------------------------------------------------------------------------------
Das Beispiel oben funktioniert auch.
Nur moechte ich jetzt, dass sich ein bestimmtes Textfeld ändert, 
je nachdem, welches andere Textfeld verändert wird (ich habe viele Textfelder in einem array).
Ich muss also irgendwie die Ereignisquelle mit der Methode textValueChanged übergegeben.
Anschliessend soll z.b. mit einer if-Abfrabe reagiert werden. Z.B. Wenn Ereignis von jTextField1 ausgelöst wurde, dannändere jTextfield2. Wenn Ereignis von jTextField3 ausgelöst wurde, dannändere jTextfield3. 

Ich hoffe, ich habe mich einigermassen verstaendlich ausgedrueckt und freue mich auf Loesungsvorschlaege.

Klaus

[/code]


----------



## Beni (3. Dez 2005)

Ich würde mehr als einen Listener verwenden (ein paar innere Klassen machen) :wink:, dann kannst du dir das if sparen.

Ansonsten: du kommst über das Event an das veränderte Document heran. Dann vergleiche dieses Document mit den Documents der JTextFields. Da ein Document von mehreren Textcomponenten benutzt werden kann, wirst du kaum direkt an das richtige Textfeld kommen (nur über das Event).


----------



## km66 (3. Dez 2005)

Danke Beni,
an die zweite Möglichkeit habe ich auch gedacht (s.u.). Nur funktioniert das leider nicht.
Wo ist der Fehler?


```
public void changedUpdate (DocumentEvent e) {
    textValueChanged(e);
  }

  public void insertUpdate (DocumentEvent e) {
    textValueChanged(e);
  }

  public void removeUpdate (DocumentEvent e) {
    textValueChanged(e);
  }

  private void textValueChanged (DocumentEvent event) {
       try {
         JTextField tf = (JTextField)event.getDocument();
         String text = tf.getText();
         System.out.println(text);
         int Eingabewert = Integer.parseInt(text);
         int Ausgabewert = Eingabewert * 5;
         System.out.println(Ausgabewert);
         jTextField2.setText(("" + Ausgabewert));
       }
       catch (NumberFormatException x) {
        //  irgendwas
       }
       catch (Exception x) {
          //  irgendwas
       }
    }
```

Danke, Klaus


----------



## Lim_Dul (3. Dez 2005)

Problem 1 an deinem Code:


```
catch (Exception x) {
          //  irgendwas
       }
```

Wenn irgendwas eine Exception schmeisst, bekommst du davon nichts mit. Da sollte mindestens ein x.printStackTrace(); hin. Noch sinnvoller wäre es nur die Exceptions zu catchen, die wirklich geworfen werden können. Das allgemeine catch(Exception x) ist meistens keine gute Idee.

Was ich nämlich stark vermute ist, dass folgende Zeile eine ClassCastException wird:


```
JTextField tf = (JTextField)event.getDocument();
```

Ein JTextField ist keine Subklasse von Document.

Wie du an das Textfeld kommst, weiß ich aber auch nicht.


----------

