嘿,
所以我目前正在一个JavaFX项目上,另一个Java项目正在处理/提供该项目的数据。
虽然大多数事情都在起作用,但我仍在尝试从数据项目中加载数据时加载ProgressBar,这是我遇到的一些问题。
当前,我正在遍历数据,为每个“条目”创建标签/将标签添加到GridPane。在其上方,我声明了JavaFX ProgressBar并将其添加到我的“根包装器” VBox
中。
GridPane wrapper = new GridPane();
ProgressBar progress = new ProgressBar();
viewBox.getChildren().add(progress);
int currentRow = 1;
for(Map.Entry<String, List<Observation>> item : handler.get(from, to).entrySet()) {
if(item != null) {
for(Observation inner : item.getValue()) {
if(inner != null) {
// Add the data for the datalist
wrapper.add(new Label(item.getKey()), 0, currentRow);
wrapper.add(new Label(inner.getDate().toString()), 1, currentRow);
wrapper.add(new Label(String.valueOf(inner.getValue())), 2, currentRow);
currentRow++;
}
}
}
}
viewBox.getChildren().add(wrapper);
现在,对于我试图实现这一目标的事情,因为我意识到仅凭此代码并不会做很多事情:
1)尝试将GridPane封装在Task
中,并从所述任务创建一个新线程-由于尝试创建JavaFX元素而没有进入JavaFX Application线程而无法正常工作
2)尝试将所有wrapper.add(new Label(...));
包装在Platform.runLater()
中-由于wrapper
不是最终的,并且需要同时存在于示波器内部和外部,因此这也不起作用。 / p>
3)尝试将按条目输入的数据添加到临时映射中,并通过让ProgressBar-part在其自己的Task / Thread中运行来显示进度。看来只要之后我使用Thread.join();
就能正常工作,但效果却非常差。
一如既往,我们将提供所有帮助。如果我忘记提及能够说明正在发生的事情,请告诉我!我试图包括所有相关内容。
谢谢!
答案 0 :(得分:1)
创建进度条后,它会显示在GUI上
progress.setProgress(double value)
具有适当的值,具体取决于您的进度。
作为一个例子,您可以像下面这样放置进度:
progress.setProgress((currentRow - 1) / handler.get(from, to).entrySet().size())
该行可以作为for循环的第一行。整个工作完成后,将进度设置为1或删除进度栏。
答案 1 :(得分:0)
可以在任何线程中创建节点,但是您一定不能从后台线程将它们添加到场景中。您也不应从后台线程更新场景中节点的属性。
GridPane wrapper = new GridPane();
ProgressBar progress = new ProgressBar();
viewBox.getChildren().add(progress);
viewBox.getChildren().add(wrapper);
new Thread(() -> {
Collection<Map.Entry<String, List<Observation>>> entries = handler.get(from, to).entrySet();
final double totalEntries = entries.size();
int currentRow = 1;
for(Map.Entry<String, List<Observation>> item : entries) {
if(item != null) {
for(Observation inner : item.getValue()) {
if(inner != null) {
// Add the data for the datalist
final Node[] nds = new Node[] {
new Label(item.getKey()),
new Label(inner.getDate().toString()),
new Label(new Label(String.valueOf(inner.getValue())))
};
final double newProgress = currentRow / totalEntries;
final int r = currentRow;
Platform.runLater(() -> {
wrapper.addRow(r, nds);
progress.setProgress(newProgress);
});
currentRow++;
}
}
}
}
}).start();