在图表加载时显示进度javafx

问题描述:

我正在用javafx编写一个程序,其中显示不同的图表。图表值基于从数据库收集的数据。由于我必须首先从数据库收集数据,然后在代码中进行进一步的计算,因此某些图表需要一些时间才能加载。我想要一个进度指示器来显示图表加载的进度。在显示图表之前,用户选择他/她想要的图表类型,然后单击“开始”按钮查看图表。单击该按钮之前,进度指示器看起来像这样和作品完美的罚款:在图表加载时显示进度javafx

Progress indicator

当用户点击“开始”按钮,图表开始加载,我想进度指示器,显示加载进度百分比。问题是只要图表开始加载进度指示器就会冻结。我试图对进度条(及其下面的文本)进行的所有更改都将在整个图表完全加载之前完成,这种方式会破坏进度指示器的整个用途。

有没有什么办法让图表加载时进度指示器发生变化?

谢谢!

+1

您是否使用做后台任务在不同的线程? – ItachiUchiha

Task不同Thread为此,更新的进度和进展属性绑定到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

谢谢你的回答!一个问题:我有不同的方法来创建不同的图表。当点击“开始”按钮时,程序会检查用户选择的图表,然后调用创建该图表的方法。例如,如果用户选择了气泡图,则会调用createBubbleChart()方法。在代码示例中,我可以在哪里调用这些不同的方法来获取与图表加载相关的进度? – ekstroom

+0

@ekstroom你最好的选择似乎是使用策略或工厂模式(工厂将创建“任务”创建图表)。策略或工厂都可以用作ComboBox的项目或类似的东西...... – f*

+0

好的,谢谢你的帮助! – ekstroom