I am currently trying to create a Stage
in a background thread using the Task<Stage>
object, which is not working, because the Task
never finishes.
Here is my code:
Task<Stage> myTask = new Task<Stage>() {
@Override
protected Stage call() throws Exception {
Stage stage = new Stage();
return stage;
}
};
myTask.setOnSucceeded(e -> {
System.out.println("done :D");
});
myTask.setOnFailed(e -> {
System.out.println("oh no");
myTask.getException().printStackTrace();
});
new Thread(myTask).start();
The method above prints oh no
and following exception message:
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.stage.Stage.<init>(Unknown Source)
at javafx.stage.Stage.<init>(Unknown Source)
at controller.ManageWebsiteTestsWindowController$OpenButton$1.call(ManageWebsiteTestsWindowController.java:77)
at controller.ManageWebsiteTestsWindowController$OpenButton$1.call(ManageWebsiteTestsWindowController.java:1)
at javafx.concurrent.Task$TaskCallable.call(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
When I use the same code to create a e.g. Label
, it works perfectly fine:
Task<Label> myTask = new Task<Label>() {
@Override
protected Label call() throws Exception {
Label label = new Label("Hello World");
return label;
}
};
myTask.setOnSucceeded(e -> {
System.out.println("done :D");
});
myTask.setOnFailed(e -> {
System.out.println("oh no");
myTask.getException().printStackTrace();
});
new Thread(myTask).start();
What am I doing wrong?
Some background information: I am trying to create a Popout
object which extends Stage
.