2015-06-22 23 views
1

我试图插入到我的数据库的一个表中,但此过程需要几分钟时间。JavaFX在进行过程中不确定进度条

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

回答

5

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控件。

+0

你更安全!!!!谢谢你的伙伴!!!!!!!!! :X –