2016-05-03 16 views
2

Ich habe diese einfache Code, unter dem aktualisiert die TextArea während updateProgress:Anfügen Text JavaFX TextArea- während Update

textArea = new TextArea(); 
textArea.setEditable(false); 
textArea.setFocusTraversable(false); 

StackPane root = new StackPane(); 
root.setPadding(new Insets(10)); 
root.getChildren().add(textArea); 

Scene scene = new Scene(root, 600, 350); 

primaryStage.setTitle("JavaFX Concurrency"); 
primaryStage.setScene(scene); 
primaryStage.show(); 

task = new Task<Integer>(){ 
    @Override 
    protected Integer call() throws Exception { 
     int i; 
     for(i = 1; i <= 100; i++){ 
      updateProgress(i, 100); 
     } 
     return i; 
    } 
}; 
task.stateProperty().addListener(new ChangeListener<State>(){ 
    @Override 
    public void changed(ObservableValue<? extends State> observable, State oldValue, State state) { 
     System.out.println(state); 
    } 
}); 
task.progressProperty().addListener(new ChangeListener<Number>(){ 
    @Override 
    public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number val) { 
     Platform.runLater(new Runnable(){ 
      @Override 
      public void run() { 
       textArea.appendText("Value : " + val.intValue() + "\n"); 
      } 
     }); 
    } 
}); 
new Thread(task).start(); 

Aber leider war das Ergebnis falsch. Hier ist die Ausgabe:

enter image description here

Ich hatte erwartet, dass die Ausgabe Wert sein sollte: 1 Wert: 100..

Ich habe gerade versucht, das Concurrency-Paket in JavaFX zu testen. Kann mir jemand sagen, was los ist?

+0

Haben Sie versucht, 'textArea.setEditable (false);' dadurch zu ändern 'textArea.setEditable (true);'? – Mxsky

+0

@Mxsky, was ist der Punkt? –

+0

Aus dem Dokument: "Legt fest oder gibt an, ob der Benutzer den Text im Textfeld bearbeiten kann." – Mxsky

Antwort

3

Wenn Sie ein einfaches Einfügen:

Thread.sleep(10); 

nach updateProgress(i, 100); nennen, wird alles besser sein. Diese stammt aus der Dokumentation von updateProgress:

Anrufe auf Update verschmolzen werden und später auf dem FX Anwendungsthread, und ruft Update, auch aus dem FX Anwendung Thread ausgeführt, müssen nicht unbedingt zur Folge sofort Updates für diese Eigenschaften und intermediate workDone-Werte können zusammengeführt werden, um Ereignisbenachrichtigungen zu speichern. max wird der neue Wert für totalWork.

Danach können Sie erleben, dass mehr Text-Zeilen in Textfeld angehängt werden, aber:

Dies stellt nicht sicher, dass alle Ihre Updates auf Ihrer Textbox getan werden!

Wenn Sie dies sicherstellen möchten, rufen Sie das GUI-Update direkt in call() der Aufgabe im Platform.runlater(...) Block verpackt.