Bonjour à tous,
Comment bloquer un swingworker tant qu’un utilisateur n’a pas saisi et validé dans un Jdialog une information ? Je m’explique.
Je dois lancer un traitement qui prend du temps à partir d’une IHM Swing. Ce traitement réalise divers calculs et à la fin doit stocker le résultat dans un fichier qui sera écrit sur le disque.
Le nom du fichier qui contiendra le résultat est choisi par l’utilisateur dans un Jdialog.
Comme mon traitement est long, je veux profiter du temps que prendra l’utilisateur à rentrer dans le Jdialog le nom du fichier, et lancer en parrallèle le SwingWorker.
Mes questions :
- Comment bloquer le SwingWorker si l’utilisateur n’a pas encore saisi et validé le nom du fichier à utiliser au moment d'écrire le résultat ?
- Comment récupérer le nom que l’utilisateur aura saisi ?
J’ai bien pensé à utiliser un CountDownLatch dans MySwingWorker, mais dans ce cas je ne peux pas récupérer la valeur de filename.
Autre possibilité : utiliser une BlockingQueue, mais j’ai l’impression d’utiliser un marteau-pilon pour écraser une mouche, car il faudrait que je gère également l’envoi d’un fileName bidon pour terminer le traitement et fermer la queue.
Avez-vous une solution simple et efficace (j’utilise Java SE7) ?
Voici ci-dessous le squelette de code :
Le code de lancement à partir de mon IHM Swing :
et le code de MySwingWorker:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 protected void someButtonActionPerformed(ActionEvent e) { MySwingWoker woker = new MySwingWorker(); Worker.execute; String fileName = JOptionPane.showInputDialog(this, "Enter the name of the file"); }
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 public class MyWorker extends SwingWorker<Void, Void> { @Override protected void doInBackground() throws Exception { doSomeBigComputation(); WriteResultInFile(); } protected void WriteResultInFile() { // Comment attendre ici ? Path p = Paths.get(fileName); // Comment récupérer la valeur de fileName de manière propre ? try { Files.createFile(p); } catch (FileAlreadyExistsException e) { Logger.getLogger(HMyWorker.class.getName()).log(Level.WARNING, null, e); } catch (IOException e) { Logger.getLogger(MyWorker.class.getName()).log(Level.WARNING, null, e); } } }
Partager