gpt4 book ai didi

java - 线程执行后刷新TableView

转载 作者:行者123 更新时间:2023-12-02 06:01:30 29 4
gpt4 key购买 nike

在我的应用程序中,我加载了一个包含数据的表。在此选项卡中,一列来自网络服务,该服务可能需要一些时间才能回答。所以我在池线程中处理这个以避免像这样阻塞屏幕:

    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;
}
});
}

线程执行良好,数据在 bean 中设置良好,但我无法刷新 tableView。我尝试快照中的代码。我尝试了在网络上找到的许多其他方法,但无济于事,该专栏非常空。

如果我保留线程循环但不执行服务并设置默认值,则该列不为空。

屏幕刷新确实是一个问题。

如何刷新此内容?

谢谢。

最佳答案

假设您的 StockListRunningBean 使用 JavaFX 可观察属性,以便 TableView 看到更改,您不需要执行任何其他操作来更新表。您的代码存在的一个问题是您正在从非 FX 应用程序线程的线程更改 UI(通过更改 StockListRunningBean 价格属性)。

尝试这个重构:

for (final StockListBean stockListBean : list) {
final int code = stockListBean.getCode(); // assuming int, change as required
final Task<Float> task = new Task<Float>() {
@Override
protected Float call() throws Exception {
logger.debug("In jfx task for {}", code);
return stocksListMService.getActualPrice(code);
}
};
task.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
@Override
public void handle(WorkerStateEvent event) {
((StockListRunningBean)stockListBean).setActualPrice(task.getValue());
}
});
executor.execute(task);
}

同样,这假设您的 StockListRunnerBean 有一个public FloatPropertyactualPriceProperty() {...}方法,并且表列已正确绑定(bind)到它。

关于java - 线程执行后刷新TableView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22632993/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com