ciao!
continuando un pò lo studio di javafx, vorrei lanciare dei task in background, e visualizzare un loading dialog durante il processo.
mi sono spulicato un pò di esempi e documentazione, e sono arrivato a questo:
codice:
public class LoadingDialog {
private final Stage dialogStage;
private final ProgressBar progressBar = new ProgressBar();
private final ProgressIndicator progressIndicator = new ProgressIndicator();
public LoadingDialog() {
dialogStage = new Stage();
dialogStage.initStyle(StageStyle.DECORATED);
dialogStage.setResizable(false);
dialogStage.initModality(Modality.APPLICATION_MODAL);
dialogStage.setTitle("LOADING");
final Label label = new Label();
label.setText("Please wait...");
//progressBar.setProgress(-1F);
progressBar.setProgress(ProgressBar.INDETERMINATE_PROGRESS);
//progressIndicator.setProgress(-1F);
progressIndicator.setProgress(ProgressIndicator.INDETERMINATE_PROGRESS);
final HBox hb = new HBox();
hb.setSpacing(5);
hb.setAlignment(Pos.CENTER);
hb.getChildren().addAll(progressBar, progressIndicator);
Scene scene = new Scene(hb);
dialogStage.setScene(scene);
}
public void activateProgressBar(final Task task) throws InterruptedException {
progressBar.progressProperty().bind(task.progressProperty());
progressIndicator.progressProperty().bind(task.progressProperty());
dialogStage.show();
}
public Stage getDialogStage() {
return dialogStage;
}
}
dal controller:
codice:
public class ControllerUno {
@FXML
Button btnTest;
@FXML
private void onBtnClicked() throws InterruptedException {
LoadingDialog loadingDialog = new LoadingDialog();
Task<Void> task = new Task<Void>() {
@Override
public Void call() throws InterruptedException {
// DO STUFF
return null;
}
};
loadingDialog.activateProgressBar(task);
task.setOnSucceeded(event -> {
loadingDialog.getDialogStage().close();
});
task.setOnCancelled(event -> {
loadingDialog.getDialogStage().close();
});
loadingDialog.getDialogStage().show();
Thread thread = new Thread(task);
thread.start();
}
}
funzionare, funziona.
volevo capire se è anche corretto come modo di procedere.
o come eventualmente posso migliorare il codice!