Я пытаюсь закрыть Stage в JavaFX из задачи (потока).
Чтобы добиться этого, я попытался передать ссылки на Stage в класс a, который расширяет Task, устанавливая текущий этап там.
Затем завершение этапа, когда вызов() завершен. Но .close() и.hide() вообще не скрывали/закрывали сцену.
Класс: SampleStage
public class SampleStage extends Application {
@Override
public void start(final Stage primaryStage) throws Exception {
primaryStage.setTitle("JavaFx Dialog");
final Button btn = new Button();
btn.setText("Click me to display popup dialog");
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override public void handle(ActionEvent e) {
Stage dialog = new Stage();
Taskee task = new Taskee();
dialog.initStyle(StageStyle.UTILITY);
task.setStage(dialog);
new Thread(task).start();
Scene scene2 = new Scene(new Group(new Text(25, 25, "Hello World!")));
dialog.setScene(scene2);
dialog.show();
}
});
StackPane root = new StackPane();
root.getChildren().add(btn);
primaryStage.setScene(new Scene(root, 300, 250));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
Класс Taskee:
import javafx.concurrent.Task; импортировать javafx.stage.Stage;
public class Taskee extends Task<Void>{
private Stage stage;
@Override
protected Void call() throws Exception {
for(int i=0;i<10;i++){
//@DoSomething()
for(long l=0;l<10000;l++);
System.out.println("i=" + i);
}
getStage().close();
getStage().hide();
return null;
}
public Stage getStage() {
return stage;
}
public void setStage(Stage stage) {
this.stage = stage;
}
}
Примечание: getStage().getScene().getWindow().hide();
тоже не работает.
Метод hide()
должен быть вызван в потоке приложения FX. (В Java 8 ваш код действительно генерирует исключение).
Используйте Task
setOnSucceeded()
обработчик, чтобы закрыть сцену в такой ситуации:
public class Taskee extends Task<Void>{
private Stage stage;
public Taskee() {
setOnSucceeded(new EventHandler<WorkerStateEvent>() {
@Override
public void handle(WorkerStateEvent event) {
if (stage != null) {
stage.hide();
}
}
});
}
@Override
protected Void call() throws Exception {
for(int i=0;i<10;i++){
//@DoSomething()
for(long l=0;l<10000;l++);
System.out.println("i=" + i);
}
return null;
}
public Stage getStage() {
return stage;
}
public void setStage(Stage stage) {
this.stage = stage;
}
}