HOWTO · Java
Nicht im FX-Anwendungsthread in Java
Dieses Tutorial demonstriert den Not on FX-Anwendungs-Thread-Fehler in Java.
Dieses Tutorial demonstriert den Fehler Not on FX application thread in Java.
den Not on FX-Anwendungsthread in Java
Der Fehler Nicht im FX-Anwendungsthread tritt auf, wenn wir versuchen, eine Methode von einem Thread aufzurufen, der kein FX-Thread ist und vom FX-Thread aufgerufen werden sollte. Dies war kein Problem mit früheren Versionen von JavaFX.
Er tritt bei der neuen Implementierung von JavaFX 8 auf. Dieser Fehler tritt auf, wenn die Benutzeroberfläche in verschiedenen Threads in der JavaFX-Anwendung geändert wird.
Hier ist ein Beispiel, das den Fehler Not on FX application thread auslöst.
Thread DemoThreadShow = new Thread(new Runnable() {
@Override
public void run() {
try {
newthread.setStyle("visibility: true");
Thread.sleep(10000);
Thread.interrupted();
} catch (Exception e) {
thread.setText("" + Integer.valueOf(thread.getText()) + 5);
newthread.setStyle("visibility: false");
}
}
});
DemoThreadShow.start();
Der obige Code erstellt einen Thread und wendet einige Methoden auf diesen Thread an. Diese Methoden stammen aus der JavaFX-Anwendung.
Beim Anwenden der Methode setText wird der Fehler Exception in Thread Thread-5 java.lang.IllegalStateException: Not on FX application thread; aktueller Thread = Thread-5.
Die folgenden Änderungen können am Code vorgenommen werden, um dieses Problem zu lösen.
-
Um während der Arbeit an FX-Anwendungen und -Threads Änderungen an der Benutzeroberfläche vorzunehmen, verwenden Sie die folgende Methode.
Platform.runLater(() -> { // GUI STUFF }); or : Platform.runLater(new Runnable() { @Override public void run() { // GUI STUFF } }); -
Anstelle des
Threadskönnen wir auchServiceundTaskverwenden.Servicehat viel mehr Funktionen alsThread.Das Ändern der Benutzeroberfläche innerhalb der Aufgabe wird niemals den Fehler
Nicht im FX-Anwendungsthreadauslösen. Hier ist ein Codebeispiel für die Verwendung vonServiceundTaskfür diesen Zweck.Service New_Service = new Service() { @Override protected Task createTask() { return new Task() { @Override protected Object call() throws Exception { Platform.runLater(() -> { // GUI stuff here }); return null; } }; } }; New_Service.start();Der obige Code ist ein bequemerer Weg als Threads.