2015-06-22 20 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 –