簡體   English   中英

Java FX-進度欄更新

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM