Отображать ProgressBar при динамической загрузке GridPane - PullRequest
0 голосов
/ 14 ноября 2018

Heyyo,

Так что в настоящее время я работаю над проектом 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(); впоследствии, но кажется крайне неэффективным.

Как всегда, любая помощь приветствуется.Если я забыл упомянуть что-то, что необходимо для того, чтобы рассказать, что происходит, пожалуйста, дайте мне знать!Я пытался включить все, что имеет отношение.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Узлы могут быть созданы в любом потоке, но вы не должны добавлять их в сцену из фонового потока. Вы также не должны обновлять свойства узлов в сцене из фонового потока.

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();
0 голосов
/ 14 ноября 2018

После того, как вы создали свой индикатор выполнения, и он отображается в вашем графическом интерфейсе, используйте

progress.setProgress(double value)

с соответствующим значением в зависимости от того, как далеко вы продвинулись в своем прогрессе.

КакНапример, вы можете поместить прогресс следующим образом:

progress.setProgress((currentRow - 1) / handler.get(from, to).entrySet().size())

Эта строка может быть помещена как первая строка в вашем цикле for.После завершения всей работы установите прогресс на 1 или удалите индикатор выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...