你能解释一下我如何刷新Label中的值吗?
在初始化中,我将Label的文本绑定到StringProperty。这没关系。
我有按钮,按下按钮我想在每个迭代步骤中更新Label值。 但我只能看到最终价值。为什么呢?
@FXML
private Label label;
@FXML
private void handleButtonAction(ActionEvent event) throws InterruptedException {
for(int i=0;i<1001;i++){
try {
Thread.sleep(1);
} catch (InterruptedException ie) {
//Handle exception
}
this.value.setValue(i+"");
}
}
// Bind
private StringProperty value = new SimpleStringProperty("0");
@Override
public void initialize(URL url, ResourceBundle rb) {
// Bind label to value.
this.label.textProperty().bind(this.value);
}
答案 0 :(得分:2)
当您调用Thread.sleep(1);
时,您实际上停止了JavaFX应用程序线程(GUI线程),因此您无法更新GUI。
你基本上需要的是后台Task
实际停止了一段时间,然后在再次进入睡眠状态之前调用Platform.runLater
来更新JavaFX应用程序线程上的GUI。
示例:强>
public class MyApplication extends Application {
private IntegerProperty value = new SimpleIntegerProperty(0);
@Override
public void start(Stage primaryStage) {
try {
HBox root = new HBox();
Scene scene = new Scene(root, 400, 400);
Label label = new Label();
Button button = new Button("Press Me");
button.setOnAction(event -> {
// Background Task
Task<Void> task = new Task<Void>() {
@Override
protected Void call() {
for (int i = 0; i < 1001; i++) {
int intVal = i;
try {
Thread.sleep(1);
} catch (InterruptedException ignored) {
}
// Update the GUI on the JavaFX Application Thread
Platform.runLater(() -> value.setValue(intVal));
}
return null;
}
};
Thread th = new Thread(task);
th.setDaemon(true);
th.start();
});
label.textProperty().bind(value.asString());
root.getChildren().addAll(button, label);
primaryStage.setScene(scene);
primaryStage.show();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
唯一剩下的就是更新按钮回调。