[英]Java FX - Progress bar update
當jar應用程序啟動時,我有一種方法需要一段時間才能完成。 為了獲得一些反饋,我創建了frmWaiting
表單,其中顯示了一個簡單的不確定進度欄。 我也有一個窗體Controller, PrincipalController
。
應用程序的入口點
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
try {
Stage stagePrincipal = new Stage();
Parent parentPrincipal = FXMLLoader.load(getClass().getClassLoader().getResource("frmPrincipal.fxml"));
Scene scenePrincipal = new Scene(parentPrincipal, 300, 275);
stagePrincipal.setScene(scenePrincipal);
stagePrincipal.setHeight(400);
stagePrincipal.setWidth(500);
stagePrincipal.setResizable(false);
stagePrincipal.setTitle("Instalador");
stagePrincipal.show();
} catch (Exception e) {
e.printStackTrace();
}
}
PrincipalController-frmPrincipal.fxml:
@Override
public void initialize(URL location, ResourceBundle resources) {
try {
Stage stageWaiting = new Stage();
Parent parentWaiting;
parentWaiting = FXMLLoader.load(getClass().getClassLoader().getResource("frmWaiting.fxml"));
Scene sceneWaiting = new Scene(parentWaiting, 300, 275);
stageWaiting.setScene(sceneWaiting);
stageWaiting.setHeight(300);
stageWaiting.setWidth(400);
stageWaiting.setResizable(false);
stageWaiting.setTitle("Instalador");
stageWaiting.show();
} catch (IOException e) {
}
}
WaitingController-frmWaiting.xml:
public class WaitingController implements Initializable {
@FXML private ImageView img;
@FXML private ProgressBar progressBar;
@FXML private ProgressIndicator pgIndicator;
private Task copyTask;
@Override
public void initialize(URL location, ResourceBundle resources) {
img.setImage(new Image(getClass().getClassLoader().getResourceAsStream("image.png")));
progressBar.setProgress(ProgressBar.INDETERMINATE_PROGRESS);
ArquivoController.getInstance().copiaArquivosPadrao(); //This is the method that takes a while.
}
public ProgressBar getProgressBar() {
return progressBar;
}
我想初始化我的主要形式frmPrincipal
,這需要花一會兒時間。 我也想讓進度條正常工作。 我試圖在另一個線程上執行此操作,但是方法完成后無法從中獲取響應。
所有.fxml文件都是正確的,如果可能的話,將其省略以使事情變得更容易。
這樣,應用程序等待方法完成,然后打開其他表單。 但是,progressBar不會更新。
內部ArquivoController.getInstance().copiaArquivosPadrao();
您必須更新progressBar
的進度。
您可以通過使用Task
來運行copiaArquivosPadrao()
,並相應地更新任務進度並將其綁定到task progress屬性,這是一種很好的方法。
或者,您可以通過將progressBar
傳遞給copiaArquivosPadrao()
來copiaArquivosPadrao()
以下操作:
public void initialize(URL location, ResourceBundle resources) {
img.setImage(new Image(getClass().getClassLoader().getResourceAsStream("image.png")));
progressBar.setProgress(ProgressBar.INDETERMINATE_PROGRESS);
ArquivoController.getInstance().copiaArquivosPadrao(progressBar); //This is the method that takes a while.
}
和
public void copiaArquivosPadrao(ProgressBar progressBar) {
// call progressBar.setProgress() in here to update the progress bar
// eg.
progressBar.setProgress(0.0F);
doSomething();
progressBar.setProgress(0.20F);
doSomething();
progressBar.setProgress(0.40F);
doSomething();
progressBar.setProgress(0.60F);
doSomething();
progressBar.setProgress(0.80F);
doSomething();
progressBar.setProgress(1.00F);
}
當然,您可以通過循環或類似方式更細粒度地執行此操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.