javafx db加载进度指示器

时间:2016-05-17 10:04:48

标签: java javafx-8

private Popup popupProgressIndicator;   
 public void showProgressIndicator(ScreensController myController) {
        if (popupProgressIndicator == null) {
            ProgressIndicator indicator = new ProgressIndicator(-1.0);
            indicator.setPrefHeight(200);
            indicator.setPrefWidth(200);
            indicator.setLayoutX(0);
            indicator.setLayoutY(0);
            popupProgressIndicator = new Popup();
            popupProgressIndicator.getContent().add(indicator);
        }
        if (!popupProgressIndicator.isShowing()) {
            popupProgressIndicator.show(primaryStage);
            popupProgressIndicator.centerOnScreen();
        }
        myController.setDisable(true);
    }
    public void hideProgressIndicator(ScreensController myController) {
        if (popupProgressIndicator.isShowing())
            popupProgressIndicator.hide();
        myController.setDisable(false);
    }

您好我正在使用上面的代码在javafx app中创建进度指示器。 我想在从db加载数据或将数据保存到db时显示进度指示器。

@FXML
private void addDesignationSelect() {
    showProgressIndicator(myController);
    Task<Void> task = new Task<Void>() {
        @Override
        protected Void call() throws Exception {
            Platform.runLater(new Runnable() {
                @Override
                public void run() {
                  // doing some heavy db process
                }
            });
            return null;
        }
        @Override
        protected void succeeded() {
            hideProgressIndicator(myController);
        }
        @Override
        protected void failed() {
            super.failed();
            hideProgressIndicator(myController);
        }
    };
    new Thread(task).start();
}

我使用了Task来加载进度条,但它没有显示进度条。我做错了什么?

1 个答案:

答案 0 :(得分:0)

在开始执行线程/任务之前,调用show your method showProgressIndicator。这就是为什么你的窗口没有显示(或显示很短的时间)的原因

您可以打开progressBar,在myController.setDisable(true);之后,您可以等待任务返回特定值(例如,使用Task<Boolean>)。

方法isDone()会告诉您任务何时结束以及何时致电hideProgressIndicator

另一种选择是从您的任务本身执行UI修改,请参阅此处的示例Task