2016-08-16 3 views
0

Я пишу программу в javafx, где отображаются разные графики. Значения диаграммы основаны на данных, собранных из базы данных. Поскольку я должен сначала собирать данные из базы данных, а затем делать som дальнейшие вычисления в коде, некоторые из диаграмм требуют некоторого времени для загрузки. Я бы хотел, чтобы индикатор прогресса показывал ход загрузки диаграммы. Перед отображением графика пользователь выбирает, какую диаграмму он хочет, а затем нажимает кнопку «Перейти», чтобы просмотреть диаграмму. Перед тем как кнопка нажата индикатор прогресса выглядит так и работает прекрасно:Показывать прогресс во время загрузки диаграммы javafx

Progress indicator

Когда пользователь нажимает на кнопку «Go» диаграмма начинает загрузку, и я хотел бы, чтобы индикатор прогресса, чтобы показать прогресс загрузки в процентах. Проблема в том, что сразу после начала загрузки графика индикатор прогресса замерзает. Все изменения, которые я пытаюсь сделать с индикатором выполнения (и текстом ниже), не будут выполняться до полной загрузки всей диаграммы, что разрушает всю цель индикатора прогресса.

Есть ли способ изменить индикатор прогресса ПОКАЖЕТ, ЧТО диаграмма загружается?

Спасибо!

+1

вы используете другую нить для делать фоновую задачу? – ItachiUchiha

ответ

1

ли это в другом Thread из Task, обновлять прогресс и связать свойство прогресса в ходе реализации Task:

@Override 
public void start(Stage primaryStage) { 
    ProgressIndicator progressIndicator = new ProgressIndicator(); 
    Button btn = new Button("Go"); 
    VBox root = new VBox(10, btn, progressIndicator); 

    btn.setOnAction((ActionEvent event) -> { 
     Task<LineChart> task = new Task<LineChart>() { 

      @Override 
      protected LineChart call() throws Exception { 
       for (int i = 0; i < 10; i++) { 
        try { 
         // do some work 
         Thread.sleep(500); 
        } catch (InterruptedException ex) { 
        } 
        updateProgress(10 * i, 100); 
       } 
       updateProgress(100, 100); 

       return new LineChart(new NumberAxis(), new NumberAxis()); 
      } 

     }; 
     progressIndicator.progressProperty().bind(task.progressProperty()); 
     task.setOnSucceeded(evt -> { 
      // handle successful completion of task on application thread 
      root.getChildren().set(root.getChildren().indexOf(progressIndicator), task.getValue()); 
     }); 
     new Thread(task).start(); 
    }); 

    Scene scene = new Scene(root, 300, 300); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 
+0

Спасибо за ваш ответ! Один вопрос: у меня разные методы создания разных диаграмм. Когда нажата кнопка «Go», программа проверяет, какой график выбрал пользователь, а затем вызывает метод создания этой диаграммы. Если пользователь, например, выбрал пузырьковую диаграмму, вызывается метод createBubbleChart(). Где я могу назвать эти разные методы в вашем примере кода для того, чтобы прогресс был связан с загрузкой этой диаграммы? – ekstroom

+0

@ekstroom Ваши лучшие варианты здесь кажутся либо с использованием стратегии, либо с заводским шаблоном (фабрика создаст «Задачу», создающую диаграмму). Как стратегия, так и завод могут быть использованы как элементы для «ComboBox» или что-то вроде этого ... – fabian

+0

Хорошо, спасибо вам за помощь! – ekstroom