Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
时间线不是无限运行的(JavaFx)_Java_Loops_Javafx_Timeline_Infinite - Fatal编程技术网

时间线不是无限运行的(JavaFx)

时间线不是无限运行的(JavaFx),java,loops,javafx,timeline,infinite,Java,Loops,Javafx,Timeline,Infinite,我曾经有一个简单的、定时的(或多或少)无限循环: while (!canrun) { do_stuff(); //simple calculation update_gui(); //updates some labels Thread.sleep(waittime); } 这会自然地冻结JavaFX应用程序,直到完成所有计算(canrun设置为false) 我将其替换为时间线: event = new EventHandler<ActionEvent&g

我曾经有一个简单的、定时的(或多或少)无限循环:

while (!canrun) {
    do_stuff(); //simple calculation
    update_gui(); //updates some labels
    Thread.sleep(waittime);
}
这会自然地冻结JavaFX应用程序,直到完成所有计算(canrun设置为false)

我将其替换为时间线:

    event = new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent actionEvent) {
            do_stuff();
            update_gui();
        }
    };
    keyframe = new KeyFrame(Duration.millis(waittime), event);
    timeline = new Timeline(Timeline.INDEFINITE, keyframe);
(此处的waittime是一个介于1和1000(ms)之间的数字)。 在按钮上单击我以timeline.play()开始,在do_stuff()中,我在计算完成timeline.stop()后停止它

我还有一个函数可以更改等待时间(即使在它运行时):

现在我的问题是,时间线只运行一次,而不是连续运行,它甚至不会再次输入do_stuff(),除非我再次调用Timeline.play()。即使直接调用timeline.setCycleCount(timeline.unfinite)也无济于事

我错过了什么


编辑:我找不到我的错误,所以我重新编写了完整的GUI,现在它可以工作了。

在时间轴构造函数中,您正在使用循环计数的常量设置帧速率


使用

通过重写我的完整GUI和时间线解决了这个问题。我不知道为什么它以前不起作用,但现在它起作用了

public void do_stuff() {
    do_the_actual_stuff();
    if (stuff_finished) timeline.stop();
}
public void changewaittime() {

    if (!(timeline.getStatus() == Animation.Status.RUNNING)) {
        keyframe = new KeyFrame(Duration.millis(waittime), event);
        timeline = new Timeline(Timeline.INDEFINITE, keyframe);
    } else {
        timeline.stop();
        keyframe = new KeyFrame(Duration.millis(waittime), event);
        timeline = new Timeline(Timeline.INDEFINITE, keyframe);
        timeline.play();
    }
}