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);
}
}
}
'JavaFX' 카테고리의 다른 글
JavaFX + Hibernate 제네릭 CRUD 인터페이스 구현하기 (0) | 2020.06.18 |
---|---|
[JavaFX] 자바 FX Not on FX application thread; currentThread = Thread - 7 (0) | 2020.06.09 |
[JavaFX] 자바fx background image styleClass로 변경 (0) | 2020.05.18 |
[JavaFX] 자바fx 팝업창 모달로 부모창 선택 못하게 initOwner, initModality, Modality (1) | 2020.05.15 |
[JavaFX] 자바fx 화면 생성과 동시에 팝업(모달) 띄우기 Platform.runLater (0) | 2020.05.14 |