从任务关闭JavaFx中的阶段

时间:2014-05-21 22:30:15

标签: java user-interface javafx javafx-2 task

我正在尝试从任务(线程)关闭JavaFX中的舞台。

为了实现这一点,我尝试将对Stage的引用传递给扩展Task的类,在那里设置当前的Stage。

然后在call()结束时关闭舞台。但 .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);
    }
}

Class Taskee:

import javafx.concurrent.Task; import 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();也不起作用。

1 个答案:

答案 0 :(得分:2)

必须在FX Application线程上调用hide()方法。 (在Java 8中,您的代码实际上会引发异常。)

使用Task的{​​{1}}处理程序在这种情况下关闭舞台:

setOnSucceeded()