首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何解决JavaFX中的future.get()阻止UI更新?

如何解决JavaFX中的future.get()阻止UI更新?
EN

Stack Overflow用户
提问于 2018-09-18 04:56:16
回答 1查看 0关注 0票数 0

有一个函数,应该从Task API的结果返回一个列表

代码语言:javascript
复制
    @Override
    public List performQuery(boolean isPaginationQuery, boolean isSortingQuery {

        try {
            TaskImpl taskImpl = new TaskImpl(isPaginationQuery,
                    isSortingQuery);
            queryExecutor.submit(taskImpl).get();
            return taskImpl.get();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

执行更新的内部类

代码语言:javascript
复制
private class TaskImpl extends Task<List> {

        private boolean isPaginationQuery, isSortingQuery;

        public TaskImpl(boolean isPaginationQuery, boolean isSortingQuery) {
            this.isPaginationQuery = isPaginationQuery;
            this.isSortingQuery = isSortingQuery;
        }

        @Override
        protected List call() throws Exception {
             Platform.runLater(() -> {
                  loaderContainer.setVisible(true);
                  loaderContainer.toFront();
             });

            HSession hSession = new HSession();
            TaskInfoDao taskInfoDao = new TaskInfoDaoImpl(hSession.getSession(), currentConnection.getConnectionId());
            if (!isPaginationQuery && !isSortingQuery) {
                paginator.setTotal(taskInfoDao.getTaskInfoWithFiltersCount(paginator.getFilterMap(), false));
            }
            Stream<TaskInfo> resultStream = taskInfoDao.getTaskInfoWithFilters(paginator.getFilterMap(), false,
                    paginator.getStartIndex() * paginator.getPageSize(),
                    paginator.getPageSize() * paginator.getPageGap());
            List<TaskInfoTableView> data = createData(resultStream);
            hSession.close();
            return data;
        }

        @Override
        protected void succeeded() {
            super.succeeded();

            try {
                //set the pagination if the task is complete
                //and it is not a pagination query
                if (!isPaginationQuery) {
                    ((TaskInfoViewController) uiController).setPagination(
                            FXCollections.observableArrayList(get()));
                }
            } catch (InterruptedException | ExecutionException e) {
                e.printStackTrace();
            }
        }

        @Override
        protected void cancelled() {
            super.cancelled();
            updateMessage("Cancelled!");
        }

        @Override
        protected void failed() {
            super.failed();
            updateMessage("Failed!");
        }
    }
EN

回答 1

Stack Overflow用户

发布于 2018-09-18 14:40:58

以下是我使用的代码:

代码语言:javascript
复制
public class MyController {
    @FXML
    TableView<Foo> tableView;

    public void initialize() {
        List result = queryController.performQuery(true, true);
        tableView.getItems().addAll(result);
    }
}

可能会做这样的事情:

代码语言:javascript
复制
public class MyController {
    @FXML
    TableView<Foo> tableView;

    public void initialize() {
        List result = queryController.performQuery(true, true, list -> tableView.getItems.addAll(list));
    }
}

public class QueryController {
    @Override
    public void performQuery(boolean isPaginationQuery, boolean isSortingQuery, java.util.function.Consumer<List> onQuerySucceeded) {

        try {
            TaskImpl taskImpl = new TaskImpl(isPaginationQuery,
                    isSortingQuery, onQuerySucceeded);

            queryExecutor.submit(taskImpl);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

private class TaskImpl extends Task<List> {

    private final java.util.function.Consumer<List> onQuerySucceeded;

    public TaskImpl(boolean isPaginationQuery, boolean isSortingQuery, java.util.function.Consumer<List> onQuerySucceeded) {
        this.isPaginationQuery = isPaginationQuery;
        this.isSortingQuery = isSortingQuery;

        this.onQuerySucceeded = onQuerySucceeded;
    }

    @Override
    protected void succeeded() {
        super.succeeded();

        // Not sure what the original codes are doing.
        try {
            //set the pagination if the task is complete
            //and it is not a pagination query
            if (!isPaginationQuery) {
                ((TaskInfoViewController) uiController).setPagination(
                        FXCollections.observableArrayList(get()));
            }
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }

        // This is what is being added in
        onQuerySucceeded.accept(this.getValue());
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100006135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档