【问题标题】:Showing progress while chart is loading javafx图表加载 javafx 时显示进度
【发布时间】:2016-12-22 15:11:31
【问题描述】:

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

当用户单击“开始”按钮时,图表开始加载,我希望进度指示器以百分比显示加载进度。问题是,一旦图表开始加载进度指示器就会冻结。在整个图表完全加载之前,我尝试对进度条(及其下方的文本)进行的所有更改都不会完成,这会破坏进度指示器的整个目的。

有什么方法可以在图表加载时更改进度指示器?

谢谢!

【问题讨论】:

  • 您是否使用不同的线程来执行后台任务?

标签: javafx progress-indicator


【解决方案1】:

在与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();
}

【讨论】:

  • 感谢您的回答!一个问题:我有不同的方法来创建不同的图表。单击“开始”按钮时,程序会检查用户选择的图表,然后调用创建该图表的方法。例如,如果用户选择了气泡图,则调用 createBubbleChart() 方法。在您的代码示例中,我可以在哪里调用这些不同的方法,以便将进度连接到该图表的加载?
  • @ekstroom 您最好的选择似乎是使用策略或工厂模式(工厂将创建Task 创建图表)。策略或工厂都可以用作ComboBox 或类似的东西......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-22
相关资源
最近更新 更多