是否有可能从javafx 2中的其他类方法关闭阶段?

时间:2013-07-25 10:54:45

标签: java javafx-2

是否可以从javafx 2中的其他类方法关闭阶段?

我正在开发很少的应用程序,但却陷入了这个问题。 我想在一段时间后从其他类方法(TimerScheduler)关闭一个加载的Login FXML GUI。我知道在一秒钟之后关闭登录阶段很奇怪,但如果可能的话我也会使用它。提前谢谢!

这是我的代码示例:

**Main.java**

@Override
public void start(Stage primaryStage) throws IOException {

    // Load the stage from FXML
    AnchorPane page = (AnchorPane) FXMLLoader.load(getClass().getResource("/fxml/FXMLLogin.fxml"));
    Scene scene = new Scene(page);
    primaryStage.setScene(scene);
    primaryStage.setResizable(false);
    primaryStage.setTitle("Admin Login");
    primaryStage.show();

    // Run the timer to execute task
    Timer timer = new Timer();
    TimerScheduler doTask = new TimerScheduler(timer);
    int firstSart = 1000;
    int period = 1000;
    timer.schedule(doTask,firstSart,period);
}


**TimerScheduler.java**

public class TimerScheduler extends TimerTask{

    Timer timer;
    int count = 0;

    public TimerScheduler(){}

    public TimerScheduler(Timer timer){
        this.timer=timer;
    }

    @Override
    public void run() {
        count++;

        if(count==30){ // execute after 30 seconds
            // I want to close the stage here
        }
    }    

}

2 个答案:

答案 0 :(得分:1)

当然通过舞台并调用stage.hide() - 因为你不在FX-Thread中,你需要将调用包装到Platform.runLater()

答案 1 :(得分:0)

我有更好的解决方案!我没有在导致在另一个线程中运行的另一个类中执行基于计时器的任务,而是将其包含在自己的类方法中,以便它可以获得相同的线程。这是我的代码。

**Main.java**

Timeline TimerTaskExec = new Timeline(new KeyFrame(Duration.seconds(1), new EventHandler<ActionEvent>() {

@Override
public void handle(ActionEvent event) {

    count++;

    if(count==30){
        // do the task
        stage.close();
    }

}

}));

TimerTaskExec.setCycleCount(Timeline.INDEFINITE);
TimerTaskExec.play();