Bonjour,
Je n’ai pas trouvé le forum spécial «SwingWorker» s’il existe, je vous demande donc de m’excuser si je ne suis pas au bon endroit.
Voilà ce que j’essaye de faire :
J’écris un programme faisant s’ouvrir une JFrame Coordonnees à un moment de son exécution. Après validation, par l’utilisateur, des nombres que celui-ci a entré dans cette JFrame, le programme utilise ces entrées pour générer un tableau de matrices nommé Cof, ce qui est rapide. Le programme doit alors calculer le déterminant de chacune de ces matrices, ce qui est évidemment relativement lourd si le tableau est grand, et s’en servir pour générer une matrice Com. Je passe donc le tableau Cof en argument d’une classe Solve qui étend SwingWorker. Le but est :
• de dégeler le JButton Validation de la fenêtre Coordonnees, qui reste bloqué pendant le calcul de la matrice Com.
• d’indiquer à l’utilisateur que le calcul est bien en cours par le rafraîchissement des JLabel Compteur et Count de la fenêtre Coordonnees. Ces deux JLabel n’affichent rien avant la validation et ensuite :
o Compteur doit afficher «Résolution :»
o Count doit afficher «0 %» au départ puis l’avancement, en %, après le calcul du déterminant de chaque élément de Cof.
Je récupère ensuite la matrice Com dans la fenêtre Coordonnees par la méthode get() de SwingWorker.
Le problème :
Le JButton Validation reste toujours bloqué pendant le calcul, de même que les deux JLabel qui n’affichent rien pendant de ce temps puis «Résolution :» et «0 %» à la fin.
Le code :
Voici le code de la classe Solve(Cof). Je n’ai pas posté celui de Coordonnees car il est d’une taille conséquente, mais je peux vous le fournir, tout ou en partie, si vous en avez besoin. J’ai également essayé de passer le code de addPropertyChangeListener dans la méthode process, mais l’effet est le même. Pareil pour la construction d’une classe Solve(Cof,i,j) ou la double boucle se trouve dans la classe Coordonnes, effectuant ainsi plusieurs appels à Solve, et en utilisant la méthode done() pour récupérer un déterminant à chaque itération. J'ai l'impression de tourner en rond, donc merci à ceux qui prendraient le temps de se pencher sur mon problème.
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
39
40
41
42
43
44
45
46
47
48
49
50 package PE; import java.awt.Rectangle; import java.beans.*; import java.math.*; import javax.swing.SwingWorker; public class Solve extends SwingWorker<Matrice,Integer> { public Matrice[][] Cof; public static final MathContext DECIMAL128 = new MathContext(34,RoundingMode.HALF_EVEN); public Solve(Matrice[][] Cof) { this.Cof = Cof; addPropertyChangeListener(new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { if("started".equals(evt.getPropertyName())) { Coordonnees.Validation.setEnabled(false); Coordonnees.Validation.updateUI(); Coordonnees.Validation.paintImmediately(new Rectangle(Coordonnees.Validation.getLocation(),Coordonnees.Validation.getSize())); Coordonnees.Compteur.setText("Resolution :"); Coordonnees.Compteur.updateUI(); Coordonnees.Compteur.paintImmediately(new Rectangle(Coordonnees.Compteur.getLocation(),Coordonnees.Compteur.getSize())); Coordonnees.Count.setText("0 %"); Coordonnees.Count.updateUI(); Coordonnees.Count.paintImmediately(new Rectangle(Coordonnees.Count.getLocation(),Coordonnees.Count.getSize())); } if("progress".equals(evt.getPropertyName())) { Coordonnees.Count.setText(String.valueOf(getProgress())+" %"); Coordonnees.Count.updateUI(); Coordonnees.Count.paintImmediately(new Rectangle(Coordonnees.Count.getLocation(),Coordonnees.Count.getSize())); } } }); } @Override public Matrice doInBackground() { Matrice Com = new Matrice(Cof.length,Cof.length); for (int i=0;i<Cof.length;i++) { for (int j=0;j<Cof.length;j++) { Com.setElement(new BigDecimal("-1.0").pow(i+j,DECIMAL128).multiply(new BigDecimal(Cof[i][j].Det().toString()),DECIMAL128),i,j); setProgress((int) (i*Cof.length+j+1)*100/(Cof.length*Cof.length)); publish(getProgress()); } } return Com; } }
chrisRg2r





Répondre avec citation
Partager