JavaFX - 刷新标签

时间:2016-05-30 09:02:54

标签: java javafx javafx-2

你能解释一下我如何刷新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);
}     

1 个答案:

答案 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);
    }
}

唯一剩下的就是更新按钮回调。