# Inhalt JTextField zur Laufzeit ändern.



## Conn (7. Jan 2007)

Hallo,
habe mal ne Anfängerfrage. Habe ein Container erstellt, in dem sich zwei JPanel befinden. Diese wiederum beinhalten JTextField Elemente. Möchte den Inhalt dieser Elemente zur Laufzeit ändern. Habe einen CaretListener() an die TextFelder angehängt. Sobald eine Tastatureingabe nicht meinen Erwartungen entspricht soll sich das TextFeld ändern. 
Das Problem this.nameTextFeld.setText("Beispiel"); funktioniert leider nicht. Conrad. ???:L


----------



## Wildcard (7. Jan 2007)

"Funktioniert nicht" ist keine sinnvolle Problembeschreibung.
Ein JTextField hat wie du bemerkt hast eine setText Methode die definitiv funktioniert.


----------



## Conn (7. Jan 2007)

Theoretisch funktioniert es aber nur solange, wie ich das JTextField dem Container bzw. dem JLabel noch nicht zugewiesen habe. Danach kommt folgende Fehlermeldung:



> Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Attempt to mutate in notification
> at javax.swing.text.AbstractDocument.writeLock(AbstractDocument.java:1323)
> at javax.swing.text.AbstractDocument.replace(AbstractDocument.java:644)
> at javax.swing.text.JTextComponent.setText(JTextComponent.java:1693)
> ...



Welche Möglichkeiten habe ich hier während der Laufzeit?!


----------



## Wildcard (7. Jan 2007)

Sieht nach einem Thread Problem aus.
Versuch mal SwingUtillities#invokeLater


----------



## Conn (7. Jan 2007)

Liegt wohl am Listener, mit CaretListener funktioniert es nicht. Mit dem ActionListener ist es kein Problem. Dafür muss dann wohl dieses JFormattedTextField benutzen. Steig nur leider noch nicht dahinter, wie das funktioniert.


----------



## Wildcard (7. Jan 2007)

Wildcard hat gesagt.:
			
		

> Versuch mal SwingUtillities#invokeLater


----------



## Conn (7. Jan 2007)

Hatte mir das ja angesehen, Problem ist nur, dass ich ungern mit Code arbeite, den ich nicht verstehe. Was macht z.B. 


```
EventQueue.invokeLater( new Runnable() 
            { 
            public void run() {
                month.setText(String.valueOf(monat));
                
            } 
            } );
```

 :?:  :?:


----------



## Wildcard (7. Jan 2007)

Das reiht 

```
month.setText(String.valueOf(monat));
```
In die Abarbeitungsqueue des EventDispatcher-Threads ein.


----------



## Conn (7. Jan 2007)

Komisch ist hier nur, das das in einer Endlosschleife durchläuft. Was kann ich tun, damit dieser Vorgang nur einmal durchgeführt wird?!


----------



## Wildcard (7. Jan 2007)

:?:


----------



## Conn (7. Jan 2007)

```
public void caretUpdate(CaretEvent event) {
      Object obj = event.getSource();
      System.out.println(month.getText());
      if (obj == this.month) {
          try{
            this.monat = Integer.valueOf(this.month.getText());
          }
          catch (NumberFormatException e) {
            EventQueue.invokeLater( new Runnable() 
            { 
            public void run() {
                month.setText(String.valueOf(monat));
                
            } 
            } );
            
          }
      }
      else
      {
          System.out.println("?");
      }
      }
      }
```

Tritt einmal NumberFormatException auf, wird der CaretEvent immer wieder angeschoben. Kann mir das nicht erklären, da es ohne das invokeLater nicht auftritt.
Hier die Ausgabe:



> 2
> 26
> 26g
> 
> ...



Bei 26g kam es das erste Mal zur NumberFormatException und danach kommt es zur Endlosschleife. ???


----------



## Wildcard (7. Jan 2007)

Wenn ich mir so ansehe was du machen willst solltest du lieber ein eigenes Document setzen und ungültige Änderungen einfach nicht akzeptieren.


----------



## Conn (7. Jan 2007)

Erstmal vielen Dank für die Hilfe, melde mich nochmal wenns geklappt hat. Gruß. Conrad.  :###


----------



## Wildcard (7. Jan 2007)

Du kannst aber auch einen InputVerifier setzen:
http://java.sun.com/j2se/1.5.0/docs...l#setInputVerifier(javax.swing.InputVerifier)


----------



## Conn (13. Jan 2007)

Noch mal vielen Dank für Deine Hilfe.   
Hatte es dann letztendlich mit dem DocumentListener gelöst, und dann gab es auch keine Probleme mehr.
Conrad.


----------

