在图表加载 javafx 时显示进度
Showing progress while chart is loading javafx
我正在用 javafx 编写一个程序,其中显示了不同的图表。图表值基于从数据库收集的数据。由于我必须首先从数据库中收集数据,然后在代码中做一些进一步的计算,一些图表需要一些时间来加载。我想要一个进度指示器来显示图表加载的进度。在显示图表之前,用户选择 he/she 想要的图表类型,然后单击 'Go' 按钮查看图表。在单击按钮之前,进度指示器看起来像这样并且工作得很好:
当用户单击 'Go' 按钮时,图表开始加载,我希望进度指示器以百分比显示加载进度。问题是一旦图表开始加载进度指示器就会冻结。在整个图表完全加载之前,我尝试对进度条(及其下方的文本)进行的所有更改都不会完成,这会破坏进度指示器的全部目的。
有什么方法可以在加载图表时更改进度指示器吗?
谢谢!
在不同于 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();
}
我正在用 javafx 编写一个程序,其中显示了不同的图表。图表值基于从数据库收集的数据。由于我必须首先从数据库中收集数据,然后在代码中做一些进一步的计算,一些图表需要一些时间来加载。我想要一个进度指示器来显示图表加载的进度。在显示图表之前,用户选择 he/she 想要的图表类型,然后单击 'Go' 按钮查看图表。在单击按钮之前,进度指示器看起来像这样并且工作得很好:
当用户单击 'Go' 按钮时,图表开始加载,我希望进度指示器以百分比显示加载进度。问题是一旦图表开始加载进度指示器就会冻结。在整个图表完全加载之前,我尝试对进度条(及其下方的文本)进行的所有更改都不会完成,这会破坏进度指示器的全部目的。
有什么方法可以在加载图表时更改进度指示器吗?
谢谢!
在不同于 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();
}