java - 显示后台任务的进度

标签 java javafx-8

嗨,我想显示后台任务的进度。

@FXML
    private void addOfficeBarrierSelect() {
        App.getInstance().showProgressIndicator(myController);
        Task<Void> task = new Task<Void>() {
            @Override
            protected Void call() throws Exception {
                ScreensController colllectScreenController = new ScreensController();
                colllectScreenController.loadScreen(Screens.ADD_OFFICE_BARRIER);
                colllectScreenController.setScreen(Screens.ADD_OFFICE_BARRIER);
                content.setContent(null);
                content.setContent(colllectScreenController);
                return null;
            }

            @Override
            protected void succeeded() {
                App.getInstance().hideProgressIndicator(myController);
            }

            @Override
            protected void failed() {
                super.failed();
                App.getInstance().hideProgressIndicator(myController);
            }
        };
        new Thread(task).start();
    }

下面的代码是我在应用程序中使用的进度弹出窗口。

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

问题是当我运行应用程序时,没有发生 FX 应用程序线程异常..

线程“Thread-6”中出现异常 java.lang.IllegalStateException:不在 FX 应用程序线程上; currentThread = Thread-6 并指向任务线程内的 void call() 方法。 有什么解决办法吗..

James_D 解决方案实际上对我有用。但我必须将代码更改为此。

showProgressIndicator(myController);
Task<FXMLLoader> task = new Task<FXMLLoader>() {
            @Override
            protected FXMLLoader call() throws Exception {
                FXMLLoader loader = new FXMLLoader(App.class.getResource(Screens.ADD_MEMBER));
                return loader;
            }
            @Override
            protected void succeeded() {
                super.succeeded();
                hideProgressIndicator(myController);
            }
            @Override
            protected void failed() {
                super.failed();
    hideProgressIndicator(myController);
            }
        };
new Thread(task).start();

再次更改代码后,进度未显示。只是关注@james_D anwser。

最佳答案

您收到异常是因为您正在从后台线程更新 UI。您需要从 FX 应用程序线程更新 UI。如果您需要在 call() 方法执行期间进行增量更新,或者(如本例所示),您可以通过调用 Platform.runLater() 来完成此操作:我不确定 loadScreensetScreen 方法的具体作用,但我假设它们不会更改现有场景图)(如果您只需要更新 UI)任务完成后,在任务的 succeeded 方法中更新 UI:

@FXML
private void addOfficeBarrierSelect() {
    App.getInstance().showProgressIndicator(myController);
    Task<ScreensController> task = new Task<Void>() {
        @Override
        protected ScreensController call() throws Exception {
            ScreensController colllectScreenController = new ScreensController();
            colllectScreenController.loadScreen(Screens.ADD_OFFICE_BARRIER);
            colllectScreenController.setScreen(Screens.ADD_OFFICE_BARRIER);
            return colllectScreenController;
        }

        @Override
        protected void succeeded() {
            super.succeeded();
            content.setContent(getValue());
            App.getInstance().hideProgressIndicator(myController);
        }

        @Override
        protected void failed() {
            super.failed();
            App.getInstance().hideProgressIndicator(myController);
        }
    };
    new Thread(task).start();
}

关于java - 显示后台任务的进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37467138/

相关文章:

java - 以围绕保留中心框的圆形图案将网格框分配给用户

java - OrientDB计算PageRank

javafx - javafx中出现新窗口时如何提供淡入淡出背景?

JavaFX 8 如何使用零参数执行 lambda 表达式

java - 如何使用 onclick 函数从 MYSQL 加载的 ListView 传递值?

java - 无法解决 Vaadin 7.6.2 与 Ivy 的依赖关系

java - UML 2.0 序列图深度

java - 如何在 JavaFX 中设置选项卡名称大小

java - 初始化使用 SceneBuilder 创建的 WebView

fxml - 如何在 TreeTableView 中显示行的网格线