创建简单的秒表-javaFX

创建简单的秒表-javaFX,java,user-interface,javafx,Java,User Interface,Javafx,我尽量避免寻求帮助,尽我所能自己做。但我在这方面工作的时间太长了。我甚至不明白是什么错了。哦,当我尝试测试它时,我的GUI冻结了 我必须做一个基本的秒表:开始、停止、恢复和重置。但我做不到。请你也评论或解释一下你的代码,因为我觉得自己不懂。(我的一些评论是过去的代码,我原以为可以用,但没有用) }我能识别出一个无限循环,其中有最好的循环: while (!onOff) { if(System.currentTimeMillis() - timestamp >

我尽量避免寻求帮助,尽我所能自己做。但我在这方面工作的时间太长了。我甚至不明白是什么错了。哦,当我尝试测试它时,我的GUI冻结了

我必须做一个基本的秒表:开始、停止、恢复和重置。但我做不到。请你也评论或解释一下你的代码,因为我觉得自己不懂。(我的一些评论是过去的代码,我原以为可以用,但没有用)


}

我能识别出一个无限循环,其中有最好的循环:

    while (!onOff)
    {
        if(System.currentTimeMillis() - timestamp > 1000)
        {
            time++;
            display.setText(String.valueOf(time)); 
        }
    }
我对JavaFX了解不多,就像我对Java/Android一样,但是在这个循环中没有任何东西会将
onOff
从false切换到true。即使您有另一个按钮回调来将
onOff
切换为true,也不会调用它,因为您的UI线程在上面的开始按钮操作循环中卡住了

更新:


现在我看到了您正在尝试做的事情:用当前时间更新文本值,您想要使用的是计时器的概念。计时器是一种UI概念,在这个概念中,您可以在将来被调用,同时仍然允许您的UI响应。在谷歌上快速搜索“JavaFX timer”会发现很多关于如何实现这一点的信息。

通过将循环直接添加到事件处理程序,您正在阻止应用程序线程。这将导致UI不会更新,也不会处理更多事件

更好地使用:

AnimationTimer timer=新的AnimationTimer(){
私有长时间戳;
私人长时间=0;
私有长分数=0;
@凌驾
公开作废开始(){
//根据上次运行的剩余时间调整的当前时间
时间戳=System.currentTimeMillis()-分数;
super.start();
}
@凌驾
公共停车场(){
super.stop();
//保存上次更新未处理的剩余时间
分数=System.currentTimeMillis()-时间戳;
}
@凌驾
公共无效句柄(长){
long newTime=System.currentTimeMillis();

如果(timestamp+1000我知道循环是无止境的。我就是这样设计的。我希望这样,当按下停止按钮时,它会将其从循环中取出。问题是,按钮回调发生在应用程序的主线程上,由调用堆栈底部循环中运行的调度事件处理程序发出。如果r按钮事件处理程序尚未返回,其他事件处理程序将无法运行。因此,您的UI线程在无限循环中冻结并变得无响应。您要做的是查看我关于UI计时器的更新答案。只需在internet上搜索“Java timer”或“JavaFX timer”。您可能只需要每1秒触发一次计时器事件。您是否可以更新屏幕上的文本。
    while (!onOff)
    {
        if(System.currentTimeMillis() - timestamp > 1000)
        {
            time++;
            display.setText(String.valueOf(time)); 
        }
    }
AnimationTimer timer = new AnimationTimer() {
    private long timestamp;
    private long time = 0;
    private long fraction = 0;

    @Override
    public void start() {
        // current time adjusted by remaining time from last run
        timestamp = System.currentTimeMillis() - fraction;
        super.start();
    }

    @Override
    public void stop() {
        super.stop();
        // save leftover time not handled with the last update
        fraction = System.currentTimeMillis() - timestamp;
    }

    @Override
    public void handle(long now) {
        long newTime = System.currentTimeMillis();
        if (timestamp + 1000 <= newTime) {
            long deltaT = (newTime - timestamp) / 1000;
            time += deltaT;
            timestamp += 1000 * deltaT;
            display.setText(Long.toString(time));
        }
    }
};