Bonjour (et bonnes fêtes),
Voici le problème que je rencontre.
J'essaye de simuler une "progressBar", en prenant un peu le contrepied de la démarche habituelle, consistant si j'ai bien tout compris à placer le traitement qui peut prendre du temps dans un thread et à afficher une barre de progression en fonction. En effet, dans mon cas c'est la barre de progression que j'essaye de mettre dans un nouveau thread ! En effet, le traitement qui prend du temps est bloquant, et le programme ne doit pas passer à l'instruction suivante tant que ce traitement n'est pas terminé. Donc si je fais un nouveau thread rien que pour ce traitement (ou si j'utilise le SwingWorker), ça merdoie ...
Mais voilà mon problème concrètement : j'ai une interface principale, et un bouton qui lance le traitement en question, qui va lui-même se charger de traiter la progress bar (qui est sous forme de texte : affichage du % d'avancement), en créant une nouvelle fenêtre secondaire dans un nouveau thread.
Le problème que je rencontre est que l'on ne voit rien dans la fenêtre où sont sensées s'afficher les infos de progression !
En fait, je me suis aperçu, que si je lançais la fenêtre sans passer par le bouton, ça marchait (on voit la progression), alors que si l'on essaye par l'intermédiaire du bouton (c'est comme ça que ça devrait marcher), eh bin rien...
Voici le code : ProgressBarPerso qui fait le traitement en appelant la fenêtre, et TestProgressBarPerso qui crée l'ihm principale et propose le bouton pour appeler le traitement. Quand on lance le test, on peut voir la fenêtre qui fait le traitement avec l'affichage, tout est ok (sauf que ce n'est pas comme ça que je veux lancer mon traitement). Mais quand on appuie sur le bouton "Go", on ne voit rien jusqu'à ce que le traitement soit fini...
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91 package Essai ; import javax.swing.JFrame ; import javax.swing.JLabel ; import javax.swing.JPanel ; class ProgressBarPerso extends JFrame { private JLabel label = new JLabel() ; private JPanel pan = new JPanel() ; ProgressBarPerso() { this.setTitle("Extraction...") ; this.setLocationRelativeTo(null) ; this.setSize(300, 100) ; pan.add(label) ; this.setContentPane(pan) ; this.setVisible(true) ; Progress prog = new Progress() ; Thread thProgres = new Thread(prog) ; thProgres.start() ; prog.setContinuer(true) ; int v = 0 ; while (v <= 100) { try { Thread.sleep(100) ; } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace() ; } v += 5 ; prog.setPourcent(v) ; } prog.setContinuer(false) ; } private class Progress extends JPanel implements Runnable { private String texteAAfficher = "" ; private int pc = 0 ; private boolean continuer = false ; private long tps = 100 ; private boolean afficher = false ; @Override public void run() { while (true) { if (continuer) { label.setText(texteAAfficher) ; repaint() ; } try { Thread.sleep(tps) ; } catch (InterruptedException e) { Thread.currentThread().interrupt() ; break ; } synchronized (this) { Thread.yield() ; continuer = this.afficher ; } } } public void setPourcent(int v) { pc = v ; texteAAfficher = "Travail effectué : " + Integer.toString(pc) + " %" ; repaint() ; } public void setContinuer(boolean c) { this.afficher = c ; } } }
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 package Essai ; import java.awt.BorderLayout; import java.awt.Button; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JFrame ; import javax.swing.JPanel; public class TestProgressBarPerso extends JFrame { private JPanel pan = new JPanel () ; private Button bouton = new Button("Go") ; private ProgressBarPerso pbp ; private ProgressBarPerso prog ; public TestProgressBarPerso() { this.setTitle("Essai pour ProgressBar") ; this.setSize(300, 300) ; this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ; this.setLocationRelativeTo(null) ; this.add(bouton, BorderLayout.NORTH) ; this.setVisible(true) ; bouton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { pbp = new ProgressBarPerso() ; // Fenêtres suivantes : ça ne marche pas ! } }) ; prog = new ProgressBarPerso () ; // Première fenêtre : ça marche } public static void main(String[] args) { TestProgressBarPerso play = new TestProgressBarPerso() ; } }
Partager