Bonjour,
Je rencontre un problème dans l'utilisation d'un service dont je souhaite suivre l'état d'avancement.
J'utilise un service pour exécuter une tâche de fond qui permet entre autre de charger des éléments dans l'interface graphique du logiciel avec une commande de ce style ("myAnchorPane.getChildren().add(inmportedNode);").
J'ai besoin de pouvoir mettre à jour le statut de progression de la tâche. J'utilise pour cela les fonction updateMessage() et updateProgress() de mon service. Une barre de progression est mise à jour lorsque le statut de progression de la tâche change.
Même si il n'est pas directement utilisable , voici un extrait de mon code :
Le problème que je rencontre c'est que le programme fonctionne lorsque j'utilise dans la tâche la commande Platform.runLater(() -> { liste d'instructions });, mais à ce moment, le suivi du status de progression de la tâche n'est plus correctement transmis par les instructions
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 taskProgressionBorderPane.startTask(); final Service<Void> importFileService = new Service<Void>() { @Override protected Task<Void> createTask() { return new Task<Void>() { @Override protected Void call() throws Exception{ Platform.runLater(() -> { updateMessage("Check System"); checkSystemModel(file); updateProgress(0.1,1.0); updateMessage("Import node framework from file"); rootLayout.openDataFile(file); // routine contenant une instruction de type "myAnchorPane.getChildren().add(inmportedNode);" updateProgress(0.2,1.0); }); return null; } }; } }; taskProgressionBorderPane.getTaskProgressionDoubleProperty().bind(importFileService.progressProperty()); taskProgressionBorderPane.getTaskStatusStringProperty().bind(importFileService.messageProperty()); importFileService.start(); importFileService.stateProperty().addListener(obs->{ switch (importFileService.getState()) { case SUCCEEDED: taskProgressionBorderPane.stopTask(); break; case FAILED: System.out.println("Task failed"); break; } });
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 taskProgressionBorderPane.getTaskProgressionDoubleProperty().bind(importFileService.progressProperty()); taskProgressionBorderPane.getTaskStatusStringProperty().bind(importFileService.messageProperty());
En supprimant l'instruction "Platform.runLater(() -> "... . Le suivi de progression fonctionne correctement, mais la tâche échoue. Le problème intervient lorsque je charge dans un AnhorPane un noeud graphique ("myAnchorPane.getChildren().add(inmportedNode);"). Cette instruction n'étant pas bloquante lorsque "Platform.runLater" est utilisé.
Je ne comprends pas vraiment cette différence de comportement.
Votre aide pour solutionner ce problème me serait bien utile.
Merci d'avance.
Partager