[英]Display ProgressBar while dynamically loading GridPane
嘿,你,
所以我目前正在處理一個 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 元素而無法工作
2) 嘗試包裝所有的wrapper.add(new Label(...));
在Platform.runLater()
- 由於wrapper
不是最終的並且需要在作用域內外都存在,這也不起作用。
3) 嘗試將數據逐項添加到臨時映射中,並通過讓 ProgressBar 部分在其自己的任務/線程中運行來以這種方式顯示進度。 只要我使用Thread.join();
似乎就可以工作Thread.join();
之后,但似乎非常無效。
與往常一樣,感謝任何和所有幫助。 如果我忘記提及需要了解發生了什么的事情,請告訴我! 我試圖包括所有相關的內容。
提前致謝!
創建進度條后,它會顯示在您的 GUI 使用中
progress.setProgress(double value)
具有適當的值,具體取決於您的進度。
例如,您可以將進度設置如下:
progress.setProgress((currentRow - 1) / handler.get(from, to).entrySet().size())
此行可以作為 for 循環中的第一行。 完成整個工作后,將進度設置為 1 或刪除進度條。
節點可以在任何線程中創建,但您不能將它們從后台線程添加到場景中。 您也不應該從后台線程更新場景中節點的屬性。
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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.