JavaFX Zugriff auf TextField aus einer anderen Klasse

cyrano

Mitglied
Hallo zusammen,

ich habe folgendes Problem: Ich hab eine kleine Bibliothek geschrieben, um den Arbeit mit der rxtx-Bibliothek zu vereinfachen. In dieser Bibliothek gibt es einen EventHandler, der jedes Mal aufgerufen wird, wenn Daten über die serielle Schnittstelle empfangen werden. Die Daten liegen als String vor und werden im Handler einfach einem TextField (JavaFX) übergeben. Ich poste mal nur die relevanten Zeilen, weil das Problem ja eher allgemein ist:

Code:
dataField.setText(sHexData);
In meiner Anwendung binde ich die Bibliothek ein und habe dort z. B. eine Scene, mit einem TextField für die Darstellung der Daten. Um die Komponenten zu "synchronisieren" habe ich in der Bibliothek eine Methode geschrieben:
Code:
public void setDataField(TextField dataField)
    {
        this.dataField = dataField;
    }
In der Anwendung rufe ich diese Methode dann auf und übergebe eine Referenz auf das TextField der Anwendung. Meine Idee dahinter:

1. Daten werden empfangen
2. Die Daten werden vom EventHandler in das TextField geschrieben
3. Da das TextField aus der Anwendung mit dem TextField der Bibliothek identische sind (gleiche Adressen) müsste der Inhalt korrekt aktualisiert werden.

Ihr werdet es schon ahnen: Ist leider nicht so! :bahnhof:

Ich hatte diese Bibliothek früher schon mit Swing verwendet also mit einem JTextField und das klappt problemlos. Jetzt erhalte ich immer die Fehlermeldung:

Exception in thread "Thread-4" java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-4

Wenn ich die Fehlermeldung richtig verstehe, liegt das Problem darin, dass es sich bei der Bibliothek nicht um eine JavaFX Applikation handelt (was ja auch nun mal so ist) und das ich wahrscheinlich nicht auf ein JavaFX Control zugreifen kann. Aber wie könnte ich das denn realisieren.

Sicherlich wäre ein Binding eine Möglichkeit, aber geht es nicht auch einfacher? Der EventHandler aktualisiert mir ja ohnehin schon die Daten, da könnte ich mir ein Binding ja eigentlich sparen.

Ich würde mich über Eure Anregungen und Tipps sehr freuen.
 
Hallo,
ich kenne dein Problem (hatte es die letzten Tage selber) !
Dein Problem ist das du die Textbox verändern willst, und zwar aus einem Thread der NICHT von JavaFX verwaltet wird!
Die Lösung ist das du es von einem JavaFX Thead erledigen lässt, dies funktioniert wie folgt mit:
Java:
Platform.runLater(new Runnable() {
    @Override public void run() {
        
            dataField.setText(sHexData);
        
            }
        })
Somit wird das setText von einem JavaFX Thread ausgeführt!

Gruß, AntiMuffin
 
Zum Hintergrund vielleicht noch etwas:
JavaFX 2.x: Concurrency in JavaFX | JavaFX 2 Tutorials and Documentation
JavaFX8: 1 Concurrency in JavaFX (Release 8)

JavaFX und viele andere Frameworks, wie etwa
- SWT - Help - Eclipse Platform
- Android - https://developer.android.com/training/multiple-threads/communicate-ui.html
- oder auch Qt - Threading Basics | Qt 5.4
- u.s.w.
haben einen exclusiven UI Thread. Und per default arbeitet man auch auf diesem. Das geht für kleine Sachen meist gut, bis man mal einen länger laufenden Task hat (dann "schläft" das GUI ein und reagiert auf keine Nutzereingaben mehr), oder eben wie du calls auf anderen Thread ausführst (oder ausführen musst).
Generell solltest du immer schauen, auf dem UI-Thread wirklich nur das zu machen, was die UI selbst betrifft und der Rest gibt sich von allein.

Grüsse,
Daniel
 
Hallo AntiMuffin... vielen vielen Dank, genau das war es. :toll::applaus: und Dir Daniel herzlichen Dank für die Hintergrundinfos. Ich werde mich da einmal intensiv mit auseinander setzen. Viele Grüße, Werner
 

Zurück
Oben