Eseguire operazioni in background in JavaFX

Mattepuffo's logo
Eseguire operazioni in background in JavaFX

Eseguire operazioni in background in JavaFX

Allora, lo scenario è questo: avviamo una operazione che visualizza un loading dialog, esegue determinate operazioni, chiude il loading dialog, ed eventualmente aggiorna un componente grafico (ad esempio una TableView).

Siamo in ambito JavaFX, che segue gli stessi principi di Swing, ma in maniera un pò diversa.

Cominciamo con una classe che si occupa di avviare il loading dialog, eseguire il task, e chiudere il dialog:

public class BackgroundTask {

    public void execTask(Task task) throws InterruptedException {
        LoadingDialog loadingDialog = new LoadingDialog();
        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();
    }

}

La classe LoadingDialog l'abbiamo vista in questo articolo.

A questo punto, abbiamo un metodo nel nostro controller che avvia il task ed esegue le operazioni richieste:

    @FXML
    private void updateBooks() {
        try {
            BackgroundTask bt = new BackgroundTask();
            Task task = new Task() {
                @Override
                public Void call() throws InterruptedException {
                    // DO STUFF
                    Platform.runLater(() -> refreshYourGUI());
                    return null;
                }
            };
            bt.execTask(task);
        } catch (InterruptedException e) {
        }
    }

Nel metodo call eseguiamo le nostre operazioni; la riga sotto ci permette di fare il refresh di un componente grafico (sempre che ne abbiate bisogno ovviamente).

Senza quella riga, il programma andrà in crash; o meglio, viene fatto tutto, ma il programma lancerà una eccezione (al contrario di quello che succede in Swing).

Enjoy!


Condividi

Commentami!