簡體   English   中英

動態加載 GridPane 時顯示 ProgressBar

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM