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

JavaFX在执行进程时不确定进度条,java,javafx,progress-bar,javafx-8,Java,Javafx,Progress Bar,Javafx 8,我正试图插入到数据库的一个表中,但此过程需要几分钟 当我的应用程序尝试插入时,我希望有一个不确定的进度条。为了拥有进度条,我想使用JavaFX,但我不知道如何实现它,它只是在插入数据库进程结束之前才显示出来。JavaFX任务可能是最好的选择。它们提供了一种在后台执行长时间运行的任务而不冻结用户界面的方法 下面是一个您可以尝试的示例: package Demo; import javafx.application.Application; import javafx.concurrent.Tas

我正试图插入到数据库的一个表中,但此过程需要几分钟


当我的应用程序尝试插入时,我希望有一个不确定的进度条。为了拥有进度条,我想使用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);
    }

}
软件包演示;
导入javafx.application.application;
导入javafx.concurrent.Task;
导入javafx.concurrent.WorkerStateEvent;
导入javafx.event.ActionEvent;
导入javafx.event.EventHandler;
导入javafx.geometry.Insets;
导入javafx.scene.scene;
导入javafx.scene.control.Button;
导入javafx.scene.control.Label;
导入javafx.scene.control.ProgressBar;
导入javafx.scene.layout.VBox;
导入javafx.stage.stage;
导入javafx.stage.StageStyle;
公共类BackgroundWorkerDemo扩展应用程序{
私有最终静态字符串CNTR\u LBL\u STR=“计数器:”;
专用int计数器;
标签标签;
按钮计数器按钮;
按钮任务按钮;
@凌驾
公共无效开始(阶段primaryStage){
计数器=0;
计数器标签=新标签(CNTR\U LBL\U STR+计数器);
计数器按钮=新按钮(“增量计数器”);
setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent e){
计数器++;
counterLabel.setText(CNTR_LBL_STR+计数器);
}
});
taskButton=新按钮(“长时间运行的任务”);
setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent e){
runTask();
}
});
VBox主窗格=新建VBox();
主窗格。设置填充(新插图(10));
主窗格。设置间距(5.0d);
mainPane.getChildren().addAll(计数器标签、计数器按钮、任务按钮);
primaryStage.setScene(新场景(主窗格));
primaryStage.show();
}
私有void runTask(){
最终双WNDW宽度=300.0d;
Label updateLabel=新标签(“正在运行的任务…”);
updateLabel.setPrefWidth(wndwWidth);
ProgressBar进度=新的ProgressBar();
进度。setPrefWidth(wndwWidth);
VBox updatePane=new VBox();
setPadding(新的插图(10));
updatePane.setSpacing(5.0d);
updatePane.getChildren().addAll(updateLabel,progress);
阶段任务更新阶段=新阶段(StageStyle.UTILITY);
taskUpdateStage.setScene(新场景(updatePane));
taskUpdateStage.show();
任务长任务=新任务(){
@凌驾
受保护的Void调用()引发异常{
int max=50;
对于(int i=1;i