Закрыть этап в JavaFx из задачи

1

Я пытаюсь закрыть 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(); тоже не работает.

Теги:
javafx
user-interface
task
javafx-2

1 ответ

2
Лучший ответ

Метод 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;
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню