본문 바로가기

JavaFX

[JavaFX] 자바FX Task ProgressBar 팝업 만들기

JavaFX ProgressBar 

데이터 처리과정을 보여줄 progressbar 를 만들기

 

 

ProgressBar 팝업 모듈

ProgressBarPopup 모듈을 만든다.

컨트롤러에서 ProgressBarPopup 객체를 생성해서 데이터 처리 과정 프로세스를 실행할 것이다.

 

public class ProgressBarPopup {

  private final Stage stage;
  private final ProgressBar pb = new ProgressBar();
  Label label = new Label();
  
  public ProgressBarPopup(){
    stage = new Stage();
    stage.initStyle(StageStyle.UTILITY);
    stage.setResizable(false);
    stage.initModality(Modality.APPLICATION_MODAL);
    
    pb.setProgress(-1F);
    pb.setStyle("-fx-pref-width:250px;");
    
    final VBox vb = new VBox();
    vb.setSpacing(5);
    vb.setAlignment(Pos.CENTER);
    vb.getChildren().addAll(pb, label);
    vb.setStyle("-fx-pref-width:300px; -fx-pref-height:100px;");
    
    Scene scene = new Scene(vb);
    stage.setScene(scene);
  }
  
  public void setLabel(String label){
    this.label.setText(label + " test...");
  }
  
  public void activateProgressBar(final Task<?> task){
    pb.progressProperty().bind(task.progressProperty());
    this.label.setText("");
    stage.show();
  }
  
  public Stage getStage(){
    return stage;
  }
}

 

 

Task 클래스

javafx.concurrent 패키징은 스레드 동시성 API를 제공한다.

이 패키징에서는 Worker 인터페이스와 이를 구현하는 클래스인 Task, Service가 있다.

Task클래스는 call() 메소드를 리턴하는데 리턴값이 없을 경우 Void를 사용해서 리턴값을 null로 한다.

private Task<Void> task;
ProgressBarPopup progress = new ProgressBarPopup();

@FXML
private void progressStart(){
  task = new Task<Void>(){
    @Override
    public Void call() throws Exception {
      final int max = 1000;
      updateProgress(0, max);
      
      for(int i=0; i<max; i++){
        process(i);
        updateProgress(i, max);
      }
      
      return null;
    }
  };
  
  progress.activateProgressBar(task);
  
  task.setOnSucceeded(event -> {
    progress.getStage().close();
  });
  
  progress.getStage().show();
}

 

progress를 호출 시 진행중인 프로세스의 메시지를 같이 보여주기 위해 process 메소드를 만들었다.

progressbarPopup 의 label에 메시지를 전달한다.

private void process(int i){
  ... 로직 실행
  String msg = ....
  
  Platform.runLater(new Runnable(){
    @Override
    public void run(){
      progress.setLabel(msg);
    }
  }
}