当前位置: 首页 > 知识库问答 >
问题:

如何使循环延迟?(JavaFX)[复制]

祝宏放
2023-03-14
button.setOnAction(new EventHandler<ActionEvent>() {
 @Override
 public void handle(ActionEvent event) {
    while(true) {
    s += 10;
    if((s>height/1.2) || (s == height/1.2)) {
        s = 0;
    }
    label.setLayoutX(s);
    }}});

如何在不停止主GUI线程的情况下停止循环?(线程。睡眠(1000)未工作)

共有1个答案

米树
2023-03-14

您可以使用JavaFXTimeline。从这里修改代码。

下面的应用程序演示了一种使用Timeline方法

import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.Duration;
/**
 *
 * @author Sedrick
 */
public class JavaFXApplication25 extends Application {

    Integer s = 0;

    @Override
    public void start(Stage primaryStage) {

        Label label = new Label(s.toString());

        //This Timeline is set to run every second. It will increase s by 10 and set s value to the label.
        Timeline oneSecondsWonder = new Timeline(new KeyFrame(Duration.seconds(1), (ActionEvent event1) -> {
            s += 10;
            label.setText(s.toString());
        }));
        oneSecondsWonder.setCycleCount(Timeline.INDEFINITE);//Set to run Timeline forever or as long as the app is running.

        //Button used to pause and play the Timeline
        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        btn.setOnAction((ActionEvent event) -> {
            switch(oneSecondsWonder.getStatus())
            {
                case RUNNING:
                    oneSecondsWonder.pause();
                    break;
                case PAUSED:
                    oneSecondsWonder.play();
                    break;
                case STOPPED:
                    oneSecondsWonder.play();
                    break;
            }                
        });

        VBox root = new VBox(btn, label);

        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

}
 类似资料:
  • 我在试着理解为什么一些简单的环路会以这样的速度运行 第一种情况: 根据IACA,吞吐量是1个周期,瓶颈是端口1,05。我不明白为什么它是1 cylce。毕竟我们有两个循环承载的依赖关系: 而且这种Latency是循环进行的,所以它应该会减慢我们的迭代。 第二种情况: 我更不明白为什么吞吐量是1.65。

  • 问题内容: 我使用以下代码为基于RotatedTranstion的ImageView创建了动画: 这将产生以下动画: 轮换行动 就像您在动画gif中注意到的那样,动画不是连续的,即在动画周期之间存在很小的延迟(暂停)。 我试图看一下API,但无法弄清楚是什么原因造成了这种延迟以及如何摆脱这种延迟。 问题答案: 每个周期之间的明显停顿是由内插器引起的,默认情况下会使用该插值器(因此它在每个周期的末尾

  • 问题内容: 我想在循环内添加延迟/睡眠: 我这样尝试过: 只有第一种情况是正确的:显示后,它将等待3秒钟,然后显示,但随后将不断重复。 我想要的是在显示3秒之后显示出来,然后它需要第二次等待3秒,依此类推。 问题答案: 该函数是非阻塞的,将立即返回。因此,您的循环将非常快速地迭代,并且将快速连续地发起3秒超时触发。这就是为什么您的第一个警报会在3秒钟后弹出,而其余所有警报都将连续不断地出现。 您可

  • 问题内容: 最终它将在jLabel上显示最终编号,但不会递增更新编号。任何帮助 问题答案: Swing是单线程的 。因此, 长时间运行的任务绝不应在EDT中进行 。这包括睡觉。而是使用。这将在后台线程中延迟,然后发布要在EDT中执行的操作。 也可以看看: 如何使用摇摆计时器 该SSCCE模仿一个计数器,该计数器从每秒开始计数(即更新实例),直到应用程序终止。

  • 问题内容: 因此,当我运行此代码时,我的JFrame变得无响应。我设法将其追溯到gameLoop()下的while循环。无论使用其中调用Thread.sleep()的delay(1000 / FRAMERATE),它都不允许键或鼠标侦听器执行其工作。 下面的完整代码,gameLoop()中存在问题 如果很重要,程序将从此处开始,然后转到Game类 可能无关紧要,但这是github存储库的插件htt

  • 问题内容: 我在玩JavaFX的。我个人认为,将鼠标悬停在某物和实际显示的工具提示之间的延迟太长了。在API中的外观显示: 通常,当鼠标移至控件上方时,工具提示将被“激活”。在工具提示被“激活”到实际显示之间通常会有一些延迟。细节(例如延迟量等)留给Skin实现。 经过进一步的调查,我找不到控制延迟的任何可能性。在JavaFX的CSS参考没有关于延迟时间和运行时间,评价信息没有帮助。 我知道,有一