Bonsoir,
J'ai créer une application qui fait du "parsing" sur des fichiers textes écrit dans un format particulier et je souhaite implémenter un SwingWorker pour pouvoir rafraîchir mon UI de façon propre et efficace.
La méthode de parsing de ma classe lit un fichier ligne par ligne (grâce à la classe Scanner) mais ne retourne pas de résultat. Elle stocke le traitement sous forme d'une collection d'objets dans un membre de la classe, et fournit des méthodes pour générer les ListModel et TableModel qui permettront de remplir la JList et la JTable de mon interface.
Voici les signatures des méthodes de ma classe
On fournit le chemin du fichier à traiter dans le constructeur de l'objet. Ensuite on exécute la méthode chargerFichier() qui effectue le traitement à proprement dit.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 <constructeur> (String cheminFichier) {...} public ListModel getListeBlocs() {...} public TableModel getBlocModel(int index) {...} public boolean estChargé() {...} void chargerFichier() {...}
Voici un peu la struture de la méthode de traitement :
L'idée pour moi, c'est de mettre le contenu de la variable nbBlocs dans un JLabel de mon interface (affichage du nombre de blocs traités).
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 public void chargerFichier() { [...] int nbBlocs = 0; [...] while (scanner.hasNextLine()) { String ligne = scanner.nextLine().trim(); [...Traitement...] nbBlocs++; } [...] }
J'ai donc fait dériver ma classe de traitement de SwingWorker, déclarer la méthode doInBackground() comme ceci.
et remplacer dans le traitement :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 public Object doInBackground() throws Exception { this.chargerFichier(); return null; }
par
Code : Sélectionner tout - Visualiser dans une fenêtre à part nbBlocs++;
Le problème c'est que, dans mon interface graphique, quand je clique sur le bouton pour commencer le traitement, mon code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 setProgress(nbBlocs++);
La ligne : listeBlocs.setModel(extObj.getListeBlocs()); provoque une erreur me disant que l'argument passé à setModel() est null. J'ai l'impression que l'instruction est exécutée avant que le traitement appelé par execute() n'est terminée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 btnExtraire.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ev) { if (!textChemin.getText().isEmpty()) { extObj.execute(); listeBlocs.setModel(extObj.getListeBlocs()); } else { JOptionPane.showMessageDialog(null, "Veuillez spécifier un fichier d'entrée.", "Avertissement", JOptionPane.WARNING_MESSAGE); } } });
Je fais sûrement fausse route quelque part, je ne maîtrise par trop cet aspect. Si vous avez une idée pour implémenter ça, je suis preneur.
En espérant avoir été clair.
Merci d'avance.
Partager