繁体   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