Hallo zusammen,
ich habe ein Programm geschrieben, bei dem durch ein Listener (hier ein MouseReleased Listener) ein neuer Thread gestartet wird. Wenn in diesem Thread z.B. der Inhalt meiner HBox geändert werden soll, bekomme ich immer Folgende Fehlermeldung:
Exception in thread "Thread-5" java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-5
at com.sun.javafx.tk.Toolkit.checkFxUserThread(Unknown Source)
at com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(Unknown Source)
at javafx.scene.Parent$2.onProposedChange(Unknown Source)
at com.sun.javafx.collections.VetoableListDecorator.clear(Unknown Source)
at Test$TestThread.run(Test.java:48)
at java.lang.Thread.run(Unknown Source)
Ich hab das Programm für euch stark vereinfacht und alles andere weggelassen, darum wundert euch nicht. Es werden jetzt nur ein blaues und ein grünes Rechteck erzeugt, aber nur das blaue ist Inhalt der angezeigten HBox. Beim Pressen der Maustaste wird der Inhalt der HBox gelöscht und stattdessen das grüne Rechteck übergeben. Soweit funkioniert es auch.
Beim Loslassen soll wieder das blaue Rechteck angezeigt werden (statt dem grünen), aber diesmal soll dieser Vorgang über einen neuen Thread ausgelöst werden. (Im echten Programm ist dies eine längere Animation, die aber nicht die Listener blockieren soll, daher der extra-Thread).
Hier das Programm:
Was genau bedeutet der Fehler und wie vermeide ich ihn?
Und nebenbei bemerkt, bei meinem vereinfachten Testprogramm greift der Released Listener bei mir auf einmal erst beim zweiten mal klicken... Ihr wisst nicht zufällig auch, woran das liegt?
Schonmal vielen Dank im Vorraus
Sugan
ich habe ein Programm geschrieben, bei dem durch ein Listener (hier ein MouseReleased Listener) ein neuer Thread gestartet wird. Wenn in diesem Thread z.B. der Inhalt meiner HBox geändert werden soll, bekomme ich immer Folgende Fehlermeldung:
Exception in thread "Thread-5" java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-5
at com.sun.javafx.tk.Toolkit.checkFxUserThread(Unknown Source)
at com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(Unknown Source)
at javafx.scene.Parent$2.onProposedChange(Unknown Source)
at com.sun.javafx.collections.VetoableListDecorator.clear(Unknown Source)
at Test$TestThread.run(Test.java:48)
at java.lang.Thread.run(Unknown Source)
Ich hab das Programm für euch stark vereinfacht und alles andere weggelassen, darum wundert euch nicht. Es werden jetzt nur ein blaues und ein grünes Rechteck erzeugt, aber nur das blaue ist Inhalt der angezeigten HBox. Beim Pressen der Maustaste wird der Inhalt der HBox gelöscht und stattdessen das grüne Rechteck übergeben. Soweit funkioniert es auch.
Beim Loslassen soll wieder das blaue Rechteck angezeigt werden (statt dem grünen), aber diesmal soll dieser Vorgang über einen neuen Thread ausgelöst werden. (Im echten Programm ist dies eine längere Animation, die aber nicht die Listener blockieren soll, daher der extra-Thread).
Hier das Programm:
Java:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.HBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
public class Test extends Application{
HBox hbox = new HBox();
Rectangle rect = new Rectangle(100, 100, 100, 100);
Rectangle rect2 = new Rectangle(100, 100, 100, 100);
TestThread newThread = new TestThread();
public static void main(String[] args) {
launch(args);
}
public void start(Stage stage) {
rect.setFill(Color.BLUE);
rect2.setFill(Color.GREEN);
hbox.getChildren().add(rect);
Scene scene = new Scene(hbox);
stage.setScene(scene);
stage.setTitle("Test");
hbox.setOnMousePressed(event -> {
hbox.getChildren().clear();
hbox.getChildren().add(rect2);
});
hbox.setOnMouseReleased(event -> {
Thread testThread = new Thread(newThread);
testThread.start();
});
stage.show();
}
private class TestThread implements Runnable{
@Override
public void run() {
hbox.getChildren().clear();
hbox.getChildren().add(rect);
}
}
}
Was genau bedeutet der Fehler und wie vermeide ich ihn?
Und nebenbei bemerkt, bei meinem vereinfachten Testprogramm greift der Released Listener bei mir auf einmal erst beim zweiten mal klicken... Ihr wisst nicht zufällig auch, woran das liegt?
Schonmal vielen Dank im Vorraus
Sugan