如何从另一个场景取消计时器 JAVA

How to cancel a timer from another scene JAVA

我已尝试阅读 java 文档并进行了大量研究,但 none 有效。基本上,当我改变场景时,我希望计时器取消。 timer.Omitted 我创建计时器的部分的代码。当我初始化时,我会调用定时器 timerUpdateLiveInfo():

private void timerUpdateLiveInfo() {
    t1.schedule(tt1, 0,5000);
}

TimerTask tt1=new TimerTask() {
    @Override
    public void run() {
        Platform.runLater(new Runnable() {
            @Override
            public void run() {
                PendingOrders.setText(String.valueOf(orderDB.getNumOfOrder()));
                String record = orderDB.getTopCanteens();
                //System.out.println(orderDB.getTopCanteens());
                String[] fields = record.split(";"); // attributes separated by ;
                String canteenTop=fields[0];
                String canteenTop2=fields[1];
                String canteenTop3=fields[2];
                MostPopularLabel1.setText(canteenTop);
                MostPopularLabel2.setText(canteenTop2);
                MostPopularLabel3.setText(canteenTop3);
            }
        });
    }
};

当我尝试通过按钮取消 "locally" 时,它起作用了。

@FXML
void handleTestingButton(ActionEvent event) {
    cancelTimer();
}

public void cancelTimer() {
    tt1.cancel();
    t1.cancel();
    System.out.println("Cancelled");
    t2.cancel();
}

然而,当我尝试在它改变场景后使用另一个 fxml 调用时,计时器仍然继续 运行:

public void handleReturnToUser(ActionEvent event) throws IOException {
    WorkerHomeController workerHome= new WorkerHomeController();
    workerHome.cancelTimer();
    FXMLLoader loader = new FXMLLoader();
    loader.setLocation(getClass().getResource("/ooppFinalProject/view/HomePage1.fxml"));
    myScene = (Scene) ((Node) event.getSource()).getScene();
    Stage stage = (Stage) (myScene).getWindow();
    Parent nextView = loader.load();
    workerHome.cancelTimer();

    stage.setScene(new Scene(nextView));
    stage.setTitle("Home Page");
    stage.show();
}

请帮忙。非常感谢!

已更新:

    public void handleReturnToUser(ActionEvent event) throws IOException{
    //workerHome.cancelTimer();
    FXMLLoader loader = new FXMLLoader();
    loader.setLocation(getClass().getResource("/ooppFinalProject/view/HomePage1.fxml"));
    myScene = (Scene) ((Node) event.getSource()).getScene();
    Stage stage = (Stage) (myScene).getWindow();
    Parent nextView = loader.load();
    //workerHome.cancelTimer();

    WorkerHomeController workerHome=loader.getController();
    workerHome.cancelTimer();

    stage.setScene(new Scene(nextView));
    stage.setTitle("Home Page");
    stage.show();
}

和堆栈跟踪:

    Caused by: java.lang.ClassCastException: ooppFinalProject.controller.HomePage1Controller cannot be cast to ooppFinalProject.controller.WorkerHomeController
at ooppFinalProject.controller.WorkerSideTabController.handleReturnToUser(WorkerSideTabController.java:91)
... 62 more

试试这个:

FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("/ooppFinalProject/view/HomePage1.fxml"));
myScene = (Scene) ((Node) event.getSource()).getScene();
Stage stage = (Stage) (myScene).getWindow();
Parent nextView = loader.load();
WorkerHomeController workerHome=loader.getController();
workerHome.cancelTimer();

说明:您需要在 WorkerHomeController 上调用 workerHome.cancelTimer();,实际上控制器是在 loader.load(); 时创建的,您可以通过 loader.getController();