在图表加载javafx时显示进度
我正在用javafx编写一个程序,其中显示了不同的图表。图表值基于从数据库收集的数据。由于我必须首先从数据库收集数据,然后在代码中进行som进一步计算,因此一些图表需要一些时间才能加载。我想要一个进度指示器来显示图表加载的进度。在显示图表之前,用户选择他/她想要的图表类型,然后单击“开始”按钮查看图表。在单击按钮之前,进度指示器如下所示,工作正常: 当用户单击“开始”按钮时,图表开始加载,我希望进度指示器以百分比显示加载进度。问题是,一旦图表开始加载,进度指示器就会冻结。我试图对进度条(及其下面的文本)所做的所有更改都将在整个图表完全加载之前完成,这会破坏进度指示器的整个用途 在加载图表时,是否有方法更改进度指示器在图表加载javafx时显示进度,javafx,progress-indicator,Javafx,Progress Indicator,我正在用javafx编写一个程序,其中显示了不同的图表。图表值基于从数据库收集的数据。由于我必须首先从数据库收集数据,然后在代码中进行som进一步计算,因此一些图表需要一些时间才能加载。我想要一个进度指示器来显示图表加载的进度。在显示图表之前,用户选择他/她想要的图表类型,然后单击“开始”按钮查看图表。在单击按钮之前,进度指示器如下所示,工作正常: 当用户单击“开始”按钮时,图表开始加载,我希望进度指示器以百分比显示加载进度。问题是,一旦图表开始加载,进度指示器就会冻结。我试图对进度条(及其下
谢谢 在与任务不同的
线程中执行此操作,更新进度并将进度属性绑定到任务的进度:
@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();
}
@覆盖
公共无效开始(阶段primaryStage){
ProgressIndicator ProgressIndicator=新的ProgressIndicator();
按钮btn=新按钮(“Go”);
VBox根=新的VBox(10,btn,progressIndicator);
btn.setOnAction((ActionEvent事件)->{
任务=新任务(){
@凌驾
受保护的线形图调用()引发异常{
对于(int i=0;i<10;i++){
试一试{
//做些工作
睡眠(500);
}捕获(中断异常例外){
}
updateProgress(10*i,100);
}
updateProgress(100100);
返回新的折线图(newnumberaxis(),newnumberaxis());
}
};
progressIndicator.progressProperty().bind(task.progressProperty());
task.setonsucceed(evt->{
//处理应用程序线程上任务的成功完成
root.getChildren().set(root.getChildren().indexOf(progressIndicator),task.getValue());
});
新线程(任务).start();
});
场景=新场景(根,300,300);
初级阶段。场景(场景);
primaryStage.show();
}
您是否使用其他线程执行后台任务?谢谢您的回答!一个问题:我有不同的方法来创建不同的图表。单击“Go”按钮时,程序将检查用户选择的图表,然后调用创建该图表的方法。例如,如果用户选择了气泡图,则调用createBubbleChart()方法。在您的代码示例中,我在哪里可以调用这些不同的方法来将进度连接到该图表的加载?@ekstroom您在这里的最佳选择似乎是使用策略或工厂模式(工厂将创建任务
创建图表)。策略或工厂都可以用作组合框
或类似内容的项。。。