javafx中让代码等待的函数

问题描述 投票:0回答:1

我对使用 javaFx 和一般编程不太熟悉,所以这可能是一个愚蠢的问题。我试图创建一个函数,使线程等待而不会使程序崩溃,这会导致类似上图的结果。 What Im trying to achive

我尝试过使用 thread.sleep 但它使 gui 崩溃,并且还导致像这样的 Timeline 或 PauseTransition 之类的东西崩溃:

public static void wait(int milliseconds) {
        Timeline timeline = new Timeline(new KeyFrame(Duration.millis(milliseconds)));
        timeline.setOnFinished(event -> {

        });
        timeline.play();
    }

但它不起作用,因为 javafx 的东西在不同的线程上工作。

java javafx java-threads pause
1个回答
0
投票

我有一个 JavaFX 应用程序,希望能够演示您想要实现的目标。这是源代码:

import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        Button button = new Button("Wait for Task Completion");
        button.setOnAction(event -> {
            // Simulating a background task
            new Thread(() -> {
                try {
                    // Simulate some work
                    Thread.sleep(5000);
                    
                    // Update UI after task completion
                    Platform.runLater(() -> {
                        // Code to execute after task completion
                        button.setText("Task Completed!");
                    });
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }).start();
        });

        StackPane root = new StackPane();
        root.getChildren().add(button);
        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

关注附加到按钮的事件处理程序。请注意,它创建并启动一个在后台运行的新线程。附加到线程的匿名函数(通过 lambda 表达式)被执行。它立即休眠 5 秒钟,然后更改按钮的文本。因为创建了一个新线程,所以睡眠不会影响 JavaFX 应用程序线程并使 GUI 崩溃。

新的后台线程实际上不会更改按钮的文本。相反,后台线程执行:

Platform.runLater(() -> {
                        // Code to execute after task completion
                        button.setText("Task Completed!");
                    });

导致按钮文本被 JavaFX 应用程序线程更改。

我希望这有帮助。

https://www.youtube.com/@jeffsprojectsworkshop

© www.soinside.com 2019 - 2024. All rights reserved.