2015-06-22 2 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); 
    } 

} 

Эта версия будет обновлять завершение задачи, если вы знаете, сколько частей ваша задача будет иметь. Если нет, закомментируйте строку в строке, которая обновляет ход выполнения, и вы получите неопределенный индикатор выполнения.

Обратите внимание, что при длительной работе вы все равно можете увеличивать счетчик. Также обратите внимание, что вы можете запускать несколько длительных задач с помощью этой программы. Если это не то, что вы хотите, вам нужно немного поиграть с элементами управления пользовательским интерфейсом.

+0

вы жизнь безопаснее !!!! Благодарю вас, приятель !!!!!!!!! :Икс –

Смежные вопросы