2017-03-07 83 views
0

我使用JavaFX创建一个Java独立应用程序。 我已经看到了一些例子,但我无法理解如何使用JavaFX的Task在我的代码的情况。更新JavaFX的控制,同时运行的应用程序

这是我要求我从SceneBuilder设置按钮的OnAction控制器功能 - >

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 

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

现在在这里,我在同一个功能逐渐更新多个控件的代码进步一步但是当执行完成后它会被更新。

我想更新而执行如图所示的代码中的控件。

回答

2

这是其他问题位的可能重复:

也许还有一些其他问题。


作为一个整体的方法,你定义一个任务,然后将任务执行体内,你利用Platform.runLater()的UpdateProgress()和其他机制来实现你所需要的。有关这些机制的进一步解释,请参阅相关问题。

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

谢谢我通过这个例子了解它。现在更清晰的想法。 –

相关问题