JavaFXTimeline-如何在课堂上的其他地方阻止它?

JavaFXTimeline-如何在课堂上的其他地方阻止它?,javafx,controls,timeline,Javafx,Controls,Timeline,第一篇文章在这里,所以请温柔 我对JavaFX相当陌生,并且已经成功地建立了一个相当复杂的GUI,它读取csv文件以填充GUI中的某些组件 我在GUI控制器的初始化函数中使用了一个时间轴,它每秒在GUI上触发一个按钮-该按钮调用一个读取csv文件表单光盘的函数。。这一切都很好 当我退出/退出GUI阶段时,我想停止运行时间线。。。但似乎无法管理这个 我有一个加载舞台的小函数,还有一个事件监听器来检测舞台何时关闭。。。我想做的是能够在评论行关闭时间线。。。在try/catch部分 public vo

第一篇文章在这里,所以请温柔

我对JavaFX相当陌生,并且已经成功地建立了一个相当复杂的GUI,它读取csv文件以填充GUI中的某些组件

我在GUI控制器的初始化函数中使用了一个时间轴,它每秒在GUI上触发一个按钮-该按钮调用一个读取csv文件表单光盘的函数。。这一切都很好

当我退出/退出GUI阶段时,我想停止运行时间线。。。但似乎无法管理这个

我有一个加载舞台的小函数,还有一个事件监听器来检测舞台何时关闭。。。我想做的是能够在评论行关闭时间线。。。在try/catch部分

public void Show_MACD() throws IOException
{
Parent root = FXMLLoader.load(getClass().getResource("MACD Turbo.fxml"));   
    Scene scene = new Scene(root);
    Stage stage = new Stage(); 
    stage.setScene(scene);
    stage.setTitle("FX AlgoTrader MACD Turbo");
    stage.show();   
    JavaFX.thisstage=stage;
    stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
          @Override
          public void handle(WindowEvent we) {
          LoginController sp=new LoginController();
              try {
                  //how can I stop the timeline here? 
                  sp.Show_Products(); // this loads up another stage - a menu in fact
              } catch (IOException ex) {
                  Logger.getLogger(MACD_Controller.class.getName()).log(Level.SEVERE, null, ex);
              }
          }
      }); 
//System.out.println("running");
}
public void Show_MACD()引发IOException
{
父根=FXMLLoader.load(getClass().getResource(“MACD Turbo.fxml”);
场景=新场景(根);
阶段=新阶段();
舞台场景;
阶段。设定标题(“外汇交易商MACD Turbo”);
stage.show();
JavaFX.thistage=stage;
stage.setOnCloseRequest(新的EventHandler(){
@凌驾
公共无效句柄(WindowEvent we){
LoginController sp=新的LoginController();
试一试{
//我如何在这里停止时间线?
sp.Show_Products();//这将加载另一个阶段—实际上是一个菜单
}捕获(IOEX异常){
Logger.getLogger(MACD_Controller.class.getName()).log(Level.SEVERE,null,ex);
}
}
}); 
//System.out.println(“运行”);
}
这里是初始化函数中的一部分,其中时间线是从…设置和运行的(这与名为“MACD_controller”的控制器在同一个类中,它也是“Show_MACD”函数的主控部分,该函数有一个用于窗口关闭事件的事件侦听器。这就是我希望在窗口关闭时停止时间线的位置)

@覆盖
公共void初始化(URL、ResourceBundle rb){
最终时间线=新时间线(新关键帧(持续时间.秒(1),新事件处理程序(){
@凌驾
公共无效句柄(ActionEvent ActionEvent)
{
Refresh.fire();//Refresh是GUI上调用csv文件的按钮
}
}));
timeline.setCycleCount(timeline.unfinite);
timeline.play();
}
我知道我需要以某种方式创建对“timeline”的引用,以便我可以使用“timeline.stop”功能。。。我试过各种各样的胡言乱语,但我总是得到一个NPE

我知道这是超基本的,但我有点卡住了

干杯
Crispin

登录控制器中的
时间线
?您好,否-时间线在GUI控制器的初始化功能中-它被称为MACD_控制器-代码段在上面。因此,时间线本质上是在同一个类中-我尝试从名为“Show_MACD”的函数中使用“timeline.stop()”(我在注释部分中使用了它,其中是“如何在此处停止时间线?”),但我得到了一个NPE。因此,即使在使用舞台右上角的X关闭舞台后,时间线仍然在后台运行,这显然不利于CPU优化等。感谢您的回复。也许来自的模式将对您有所帮助。在您发布的代码中,
timeline
initialize
函数中的局部变量。您确定已将其分配给控制器类的字段吗?您好,谢谢您的评论。我阅读了传递的参数和fxml,但时间轴实际上是一个局部变量,而不是类开头定义的@fxml变量的一部分。实际上,上面发布的initialize函数确实将“timeline”声明为本地变量,但我也尝试在类的开头将“timeline”声明为公共变量。。。因此,我添加了“public Timeline”,然后删除了上面代码中声明时间线的“final”属性。。仍然有NPE试图在全球范围内声明“时间线”。我可以发布整个课程,但有800行:(
@Override
public void initialize(URL url, ResourceBundle rb) {

final Timeline timeline = new Timeline(new KeyFrame(Duration.seconds(1), new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent actionEvent) 
             {
             Refresh.fire(); //Refresh is a button on the GUI which calls the csv file
             }
        }));
    timeline.setCycleCount(Timeline.INDEFINITE);
    timeline.play();
}