2017-03-07 3 views
0

Ich verwende JavaFx zum Erstellen einer Java Standalone-Anwendung. Ich habe einige Beispiele gesehen, aber ich bin nicht in der Lage zu verstehen, wie man das JavaFX Task in meinem Codeszenario verwendet.Aktualisieren von JavaFX-Steuerelementen beim Ausführen der App

Dies ist die Controller-Funktion, die ich für Button onAction nenne, die ich von SceneBuilder gesetzt haben ->

public class MainScreenController { 
    @FXML 
    private JFXButton btnSelectImg; 
    @FXML 
    private ImageView imageViewObj; 
    @FXML 
    private ProgressBar progressBarObj; 
//.. 
//.. 
    @FXML 
    private void onFileSelectButtonClick() { 
     //Some Operations are carried out 
     //.. 
     //Then I want to set Image in ImageView 
     imageViewObj.setImage(myImage); 

     // Some Code Here 
     //.. 

     // Set Progress 
     progressBarObj.setProgress(0.1); 

     // Some Code Here 
     //.. 

     // Set Progress 
     progressBarObj.setProgress(0.2); 

     //... 
     //... 

     // Maybe change some other Controls 

     //.......... 
    } 
    //.. 
//.. 
} 

Hier ich mehrere Kontrollen in der gleichen Funktion nach und nach durch fortschreitet, wie der Code Schritt am Aktualisierung Schritt, aber es wird zuletzt aktualisiert, wenn die Ausführung abgeschlossen ist.

Ich möchte die Steuerelemente während der Ausführung wie im Code angezeigt aktualisieren.

Antwort

2

Dies ist ein wahrscheinlich ein Duplikat von Bits anderer Fragen:

Und vielleicht einige andere Fragen.


Als Gesamtkonzept definieren Sie eine Aufgabe, dann innerhalb des Ausführungs Körpers der Aufgabe, Sie von Platform.runLater(), Update() und anderen Mechanismen machen zu erreichen, was Sie brauchen. Weitere Informationen zu diesen Mechanismen finden Sie in der entsprechenden Frage.

final ImageView imageViewObj = new ImageView(); 
Task<Void> task = new Task<Void>() { 
    @Override protected Void call() throws Exception { 
     //Some Operations are carried out 
     //.. 

     //Then I want to set Image in ImageView 
     // use Platform.runLater() 
     Platform.runLater(() -> imageViewObj.setImage(myImage)); 

     // Some Code Here 
     //.. 

     // Set Progress 
     updateProgress(0.1, 1); 

     // Some Code Here 
     //.. 

     // Set Progress 
     updateProgress(0.2, 1); 

     int variable = 2; 
     final int immutable = variable; 

     // Maybe change some other Controls 
     // run whatever block that updates the controls within a Platform.runLater block. 
     Platform.runLater(() -> { 
      // execute the control update logic here... 
      // be careful of updating control state based upon mutable data in the task thread. 
      // instead only use immutable data within the runLater block (avoids race conditions). 
     }); 

     variable++; 

     // some more logic related to the changing variable. 

     return null; 
    } 
}; 

ProgressBar updProg = new ProgressBar(); 
updProg.progressProperty().bind(task.progressProperty()); 

Thread thread = new Thread(task, "my-important-stuff-thread"); 
thread.setDaemon(true); 
thread.start(); 
+0

Dank Ich verstand es durch dieses Beispiel.Gut viel klarer Idee jetzt. –

Verwandte Themen