0
在我的应用程序中,我加载一个包含数据的表。 在这个标签中,一列来自一个web服务,它可以做出一些回答。 所以我把这个在池中的线程,以避免遮挡屏幕是这样的:线程执行后刷新TableView
final ObservableList<StockListBean> list = FXCollections
.observableArrayList();
list.addAll(stocksListMService.getStocksListRunning());
stocksList.setItems(list);
final ExecutorService executor = Executors.newFixedThreadPool(4);
for (final StockListBean stockListBean : list) {
executor.execute(new Task<Float>() {
@Override
protected Float call() throws Exception {
logger.debug("In jfx task for {}", stockListBean.getCode());
((StockListRunningBean)stockListBean).setActualPrice(stocksListMService.getActualPrice(stockListBean.getCode()));
columnActualPrice.setVisible(false);
columnActualPrice.setVisible(true);
return 0f;
}
});
}
的线程以及执行和数据豆类以及设置,但我没有达到刷新的tableView。 我尝试快照中的代码。我尝试了很多在网上找到的其他方式,但没有做任何事情,这个专栏非常空洞。
如果我保持线程循环,但不执行服务并设置默认值,则此列不为空。
这是一个真正的屏幕刷新问题。
我该如何刷新?
谢谢。
我发现执行者不会抛出异常,只是关闭。如果您在try块中包装调用UI线程的方法,则可能会看到该错误。调试和查找线程错误的真正痛苦。 – brian
如果发生异常,处理它们的方法是向任务注册'setOnFailed'处理程序:task.setOnFailed(new EventHandler(){...});' –
服务没有异常抛出。我的stockListBean不是JFX可观察的,因为它被多个应用程序使用。我需要简单的变量类型。该任务允许在FX应用程序线程中获得线程。 – Kiva