这是我按下按钮theButton
时用于在表格视图中添加元素的代码。
表格视图中填充了从网页上获取的元素,因此要填充整个表视图需要大约30秒......
我想动态添加所有数据,不希望所有放入表中的数据都准备就绪。所以现在碰巧按下按钮时,显示结果大约需要30秒左右。这是我的代码,它有什么问题吗?谢谢。
theButton.setOnAction(new EventHandler()
{
@Override
public void handle(Event event)
{
try
{
ObservableList<Elements> toShow = FXCollections.observableArrayList();
ArrayList<String> strings = takeSomeStrings();
for (int i = 0; i < strings.size(); i++)
{
toShow.add(new Elements(takeInfoFromTheWeb(strings.get(i))));
myTableView.setItems(toShow);
}
} catch (FileNotFoundException e)
{
e.printStackTrace();
}
}
}
}
答案 0 :(得分:2)
使用 executor 在后台从Web获取数据。获取后,使用Platform.runLater()
修改JavaFX应用程序线程上的TableView。
import java.util.concurrent.Executors;
private final Executor executor = Executors.newSingleThreadExecutor();
theButton.setOnAction(event ->
{
try
{
ObservableList<Elements> toShow = FXCollections.observableArrayList();
myTableView.setItems(toShow);
ArrayList<String> strings = takeSomeStrings();
for (String s: strings)
{
executor.execute(() -> {
Elements el = new Elements(takeInfoFromTheWeb(s));
Platform.runLater(() -> toShow.add(el));
});
}
} catch (FileNotFoundException e)
{
e.printStackTrace();
}
});
如果要并行获取数据,只需替换执行程序,例如
private final Executor executor = Executors.newFixedThreadPool(4);
您将同时下载最多4个项目。