我对使用 javaFx 和一般编程不太熟悉,所以这可能是一个愚蠢的问题。我试图创建一个函数,使线程等待而不会使程序崩溃,这会导致类似上图的结果。
我尝试过使用 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 的东西在不同的线程上工作。
我有一个 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 应用程序线程更改。
我希望这有帮助。