当前位置: 首页 > 面试题库 >

JavaFX在执行过程时不确定进度条

孙宏扬
2023-03-14
问题内容

我试图将其插入数据库的一个表,但是此过程需要几分钟。

在我的应用程序尝试插入时,我希望有一个不确定的进度栏。为了有进度条,我想使用JavaFX,但是我不知道如何实现它,直到插入数据库过程结束为止,它才显示出来。


问题答案:

JavaFX任务可能是解决之道。它们提供了一种在后台执行长时间运行的任务而不冻结用户界面的方法。

这是您可以尝试的示例:

package Demo;

import javafx.application.Application;
import javafx.concurrent.Task;
import javafx.concurrent.WorkerStateEvent;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ProgressBar;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

public class BackgroundWorkerDemo extends Application {

    private final static String CNTR_LBL_STR = "Counter: ";
    private int counter;

    Label counterLabel;
    Button counterButton;
    Button taskButton;

    @Override
    public void start(Stage primaryStage) {
        counter = 0;
        counterLabel = new Label(CNTR_LBL_STR + counter);
        counterButton = new Button("Increment Counter");
        counterButton.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent e) {
                counter++;
                counterLabel.setText(CNTR_LBL_STR + counter);
            }
        });
        taskButton = new Button("Long Running Task");
        taskButton.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent e) {
               runTask();
            }
        });

        VBox mainPane = new VBox();
        mainPane.setPadding(new Insets(10));
        mainPane.setSpacing(5.0d);
        mainPane.getChildren().addAll(counterLabel, counterButton, taskButton);
        primaryStage.setScene(new Scene(mainPane));
        primaryStage.show();
    }

    private void runTask() {

        final double wndwWidth = 300.0d;
        Label updateLabel = new Label("Running tasks...");
        updateLabel.setPrefWidth(wndwWidth);
        ProgressBar progress = new ProgressBar();
        progress.setPrefWidth(wndwWidth);

        VBox updatePane = new VBox();
        updatePane.setPadding(new Insets(10));
        updatePane.setSpacing(5.0d);
        updatePane.getChildren().addAll(updateLabel, progress);

        Stage taskUpdateStage = new Stage(StageStyle.UTILITY);
        taskUpdateStage.setScene(new Scene(updatePane));
        taskUpdateStage.show();

        Task longTask = new Task<Void>() {
            @Override
            protected Void call() throws Exception {
                int max = 50;
                for (int i = 1; i <= max; i++) {
                    if (isCancelled()) {
                        break;
                    }
                    updateProgress(i, max);
                    updateMessage("Task part " + String.valueOf(i) + " complete");

                    Thread.sleep(100);
                }
                return null;
            }
        };

        longTask.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
            @Override
            public void handle(WorkerStateEvent t) {
                taskUpdateStage.hide();
            }
        });
        progress.progressProperty().bind(longTask.progressProperty());
        updateLabel.textProperty().bind(longTask.messageProperty());

        taskUpdateStage.show();
        new Thread(longTask).start();
    }

    public static void main(String[] args) {
        launch(args);
    }

}

如果您知道任务将包含多少部分,则此版本将更新任务完成情况。如果没有,请注释更新进度的行中的行,您将获得不确定的进度栏。

请注意,在执行长任务时,您仍然可以增加计数器。还要注意,您可以使用该程序启动多个长期运行的任务。如果那不是您想要的,您将需要对UI控件进行一些调整。



 类似资料:
  • 我目前正在为Python2.7创建Tkinter Gui,但无法使用进度条。我需要将较大的文件加载到我的程序中,这需要一些时间,所以我想获得一个进度条,向用户显示程序没有冻结加载文件。不幸的是,在加载文件时,我的进度条似乎没有更新:(我已经尝试为进度条创建一个新线程,但没有成功。所以我想知道,在一个沉重的函数调用期间,我需要做什么才能让一个不确定的进度条运行? 我的代码的相关部分是:

  • 我已经读了一段时间关于进度条,但我仍然找不到我的问题的答案。也许是我还没有意识到的东西。 我想知道,如果有可能创建一个进度条,与程序完成的百分比。我真的很困惑,因为我不知道我能否计算出行刑前所需的时间。 如果有任何帮助,我将不胜感激。问候

  • 我正在创建一个JavaFX桌面应用程序,我在上面模拟一些工作负载。我希望应用程序有一个动态更新的进度指示器(随着时间的推移),以显示加载过程是如何进行的。这是我的应用程序类: 这是我的预加载程序类: 另外,我需要说的是,我已经检查了这两个问题(预加载程序中的progressbar不更新和javafx预加载程序不更新进度),但没有找到解决问题的方法。 非常感谢您抽出时间。

  • 本文向大家介绍Spring Boot定时+多线程执行过程解析,包括了Spring Boot定时+多线程执行过程解析的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Spring Boot定时+多线程执行过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Spring Boot 定时任务有多种实现方式,我在一个微型项目中通过注解方式执

  • 主要内容:创建ProgressBar进度条()可视化JavaFX应用程序中的操作进度。 上面的代码生成以下结果。 创建ProgressBar 以下代码显示如何通过传递值来创建。 还可以使用空构造函数创建没有参数的进度条。然后使用方法分配值。如果我们不能确定任务的完全完成时间,可以设置进度条在不确定模式,直到确定任务的长度。 以下代码显示如何创建一个完成的进度条()。 上面的代码生成以下结果。