簡體   English   中英

從任務中關閉JavaFx階段

[英]Close Stage in JavaFx from task

我正在嘗試從任務(線程)關閉JavaFX中的Stage。

為了完成此任務,我嘗試將對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);
    }
}

班級任務負責人:

導入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 Application線程上調用。 (在Java 8中,您的代碼實際上會引發異常。)

在以下情況下,使用TasksetOnSucceeded()處理程序關閉舞台:

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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM