2016-05-30 1 views
1

Не могли бы вы объяснить мне, как я могу обновить значение в ярлыке?JavaFX - Обновить ярлык

В инициализации я привязываю текст метки к элементу StringProperty. Здесь все нормально.

У меня есть кнопка, и при нажатии кнопки я хочу обновить значение метки на каждом шаге итерации. Но я вижу только окончательное значение. Зачем?

@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

Ну, так что, когда вы звоните Thread.sleep(1); вы на самом деле останавливает поток приложения JavaFX (GUI Thread), поэтому предотвратить его обновить GUI.

Что вам в принципе нужно - это фон Task, который фактически останавливается на определенное количество времени, а затем обновляет графический интерфейс в приложении JavaFX Application Thread, вызывая Platform.runLater, прежде чем снова перейдет в режим сна.

Пример:

package application; 

import javafx.application.Application; 
import javafx.application.Platform; 
import javafx.beans.property.SimpleStringProperty; 
import javafx.beans.property.StringProperty; 
import javafx.concurrent.Task; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.stage.Stage; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.layout.HBox; 


public class Main extends Application { 

    private StringProperty value = new SimpleStringProperty("0"); 

    @Override 
    public void start(Stage primaryStage) { 
     try { 
      HBox root = new HBox(); 
      Scene scene = new Scene(root,400,400); 

      Label label = new Label(); 

      Button b1 = new Button("Press Me"); 
      b1.setOnAction(new EventHandler<ActionEvent>() { 

       @Override 
       public void handle(ActionEvent event) { 
        // Background Task 
        Task<Integer> task = new Task<Integer>() { 
         @Override 
         protected Integer call() throws Exception { 
          int i; 
          for (i = 0; i < 1001; i++) { 
           final int val = i; 
           try { 
            Thread.sleep(1); 
           } catch (InterruptedException ie) { 
           } 

           // Update the GUI on the JavaFX Application Thread 
           Platform.runLater(new Runnable() { 

            @Override 
            public void run() { 
             value.setValue(String.valueOf(val)); 
            } 
           }); 

          } 
          return i; 
         } 
        }; 

        Thread th = new Thread(task); 
        th.setDaemon(true); 
        th.start(); 
       } 
      }); 


      label.textProperty().bind(value); 
      root.getChildren().addAll(b1, label); 

      primaryStage.setScene(scene); 
      primaryStage.show(); 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 



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

Вам просто нужно просто обновить обработку кнопки с моим.