使用 Platform.runLater 更新 UI
不能在 JavaFX 應用程式執行緒上執行長時間執行的操作,因為這會阻止 JavaFX 更新 UI,從而導致凍結的 UI。
此外,對作為實時場景圖的一部分的 Node
的任何更改都必須在 JavaFX 應用程式執行緒上進行。Platform.runLater
可用於在 JavaFX 應用程式執行緒上執行這些更新。
以下示例演示如何從不同的執行緒重複更新 Text
Node
:
import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.scene.text.Text;
import javafx.stage.Stage;
public class CounterApp extends Application {
private int count = 0;
private final Text text = new Text(Integer.toString(count));
private void incrementCount() {
count++;
text.setText(Integer.toString(count));
}
@Override
public void start(Stage primaryStage) {
StackPane root = new StackPane();
root.getChildren().add(text);
Scene scene = new Scene(root, 200, 200);
// longrunning operation runs on different thread
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
Runnable updater = new Runnable() {
@Override
public void run() {
incrementCount();
}
};
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
}
// UI update is run on the Application thread
Platform.runLater(updater);
}
}
});
// don't let thread prevent JVM shutdown
thread.setDaemon(true);
thread.start();
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}