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

在javafx中延迟更新场景

陈知
2023-03-14

对我如何做到这一点有什么建议吗?

这是我到目前为止编写的代码,但它似乎忽略了Thread.Sleep并且只使第三个代码变为蓝色。


import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

import static javafx.scene.paint.Color.*;

public class UpdatingSceneWithDelays extends Application {
    @Override
    public void start(Stage stage) throws Exception {
        AnchorPane anchorPane = new AnchorPane();
        Rectangle rectangle1 = new Rectangle(100, 100, 100, 100);
        Rectangle rectangle2 = new Rectangle(100, 250, 100, 100);
        Rectangle rectangle3 = new Rectangle(100, 400, 100, 100);
        Button button1 = new Button("cancel");
        Button button2 = new Button("update");
        button2.setLayoutY(100);
        button1.setOnMouseClicked(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent mouseEvent) {
                rectangle1.setFill(BLACK);
                rectangle2.setFill(BLACK);
                rectangle3.setFill(BLACK);
            }
        });
        button2.setOnMouseClicked(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent mouseEvent) {
                rectangle1.setFill(RED);
                rectangle2.setFill(BLACK);
                rectangle3.setFill(BLACK);
                try {
                    Thread.sleep(500);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                rectangle1.setFill(BLACK);
                rectangle2.setFill(GREEN);
                rectangle3.setFill(BLACK);
                try {
                    Thread.sleep(500);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                rectangle1.setFill(BLACK);
                rectangle2.setFill(BLACK);
                rectangle3.setFill(BLUE);
            }
        });
        anchorPane.getChildren().add(rectangle1);
        anchorPane.getChildren().add(rectangle2);
        anchorPane.getChildren().add(rectangle3);
        anchorPane.getChildren().add(button1);
        anchorPane.getChildren().add(button2);
        Scene scene = new Scene(anchorPane, 800, 800);
        stage.setScene(scene);
        stage.show();
    }
}


共有1个答案

倪阳飇
2023-03-14

您不能HibernateJavaFX应用程序线程。该线程专门用于读写UI状态、调度呈现“脉冲”以及处理用户生成的事件。如果您阻止或独占了它,那么它就不能完成它的工作,并且UI冻结/变得没有响应。

无论何时您想要在JavaFX应用程序线程上执行延迟操作,无论是否循环,您都应该使用动画。就我个人而言,在本例中,我会使用时间线。这里有一个例子:

java prettyprint-override">Timeline timeline =
    new Timeline(
        // first rectangle to red (assumes all start as black)
        new KeyFrame(
            Duration.ZERO, 
            e -> rectangle1.setFill(Color.RED)),
        // first rectangle to black, second to green
        new KeyFrame(
            Duration.seconds(0.5),
            e -> {
              rectangle1.setFill(Color.BLACK);
              rectangle2.setFill(Color.GREEN);
            }),
        // second rectangle to black, third to blue
        new KeyFrame(
            Duration.seconds(1.0), // duration doesn't stack
            e -> {
              rectangle2.setFill(Color.BLACK);
              rectangle3.setFill(Color.BLUE);
            }));
timeline.playFromStart();

您可以根据需要重用动画(尽管它不能同时运行自身的多个实例)。请注意,时间线将异步播放,对playFromstart()play()的调用将立即返回。如果这是您的应用程序的一个问题,那么您需要重写它以考虑到这一点。例如,可以使用timeline.setonfinished(...)在完成后执行某些操作。

为了提出它们,这里至少有两种可供选择的方法(我将不详细说明):

 类似资料:
  • 我在更新BigQuery模式时遇到了一些延迟问题。 我有一个表,它接收流式插入,并且架构在需要时会自动更新。问题在于,架构更新似乎在一段时间内不会生效,并且在该持续时间内进行的插入会删除新列的值。 我从2016年发现了这个答案,它说在更改生效之前可能会有长达5分钟的延迟。 这种情况仍然存在吗?您如何解决这一问题?如果答案是超时,那么在写入新列之前应该等待多长时间?

  • 我是JavaFX的新手。我有我的主要场景和次要场景;当我从第一个场景切换到第二个场景时,窗口的条形图变得可见。我该怎么解决呢?

  • 问题内容: 我需要在循环中对数据库进行SQL查询: 更好的方法是:保持原样或循环后移动: 或者是其他东西 ? 问题答案: 整个要点是直到函数返回才执行,因此将其放置在要关闭的资源打开后的适当位置。但是,由于要在循环内创建资源,因此根本不要使用defer- 否则,在函数退出之前,您不会关闭在循环内创建的任何资源,因此它们会堆积直到然后。相反,您应该在每次循环迭代结束时关闭它们, 而无需 :

  • 描述 我有一个小应用程序,它使用hook更新状态,但每次更新时,都会导致页面延迟。我指的是实际的延迟,而不仅仅是“等待异步”延迟。 我的理论是,更新状态会重新呈现太多的组件,因为如果我将状态减少到更少的值,滞后就会消失。 从本质上说,我担心我更新状态的方式没有隔离我想要的值。 密码 我将回购加载到CodeSandbox:https://codesandbox.io/s/long-forest-y9

  • 我是JavaFX的新手。我试图编程一个简单的图形用户界面,但我面临着那些可能相关的问题。我用文件选择器设置文件,并想做相当基本的操作: 保存最后使用的文件夹 在VBox中写入选中文件的名称 这是我的代码(编译): 我无法刷新节点以设置当前初始目录或在VBox上显示collecName。我试图通过重新加载对象或调整窗口大小来重新生成它们,但没有任何效果。当我在控制台上打印变量时,我看到它们发生了变化

  • }`我正在计划在同一舞台上使不同的部分成为自己的场景。如果有任何帮助,我将不胜感激。我正在使用NetBeans8.2。