在动态加载GridPane

时间:2018-11-14 12:53:38

标签: java multithreading javafx

嘿,

所以我目前正在一个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();就能正常工作,但效果却非常差。

一如既往,我们将提供所有帮助。如果我忘记提及能够说明正在发生的事情,请告诉我!我试图包括所有相关内容。

谢谢!

2 个答案:

答案 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();