J'ai rajouté une barre de progression pour mon porgramme.
Donc :
Une interface graphique : une barre de progression (0 à 100) et en dessous trois boutons play, pause, stop. La barre de progression indique visuellement la progression du travail d'un Thread. L'appui sur play lance le travail, l'appui sur pause arrête le travail un appui sur play reprend là où il était, l'appui sur stop arrête le travail un appui sur play reprend au début. Lorsque le travail du thread est terminé soit on arrête soit on reprend du début suivant la valeur d'un booléen boucle.
La classe du Thread
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118 public class Fenetre extends JFrame implements ActionListener, ObservateurLecteur { private MonThread monThread; JButton stop = new JButton("Stop") ; JButton pause = new JButton("Pause"); JButton play = new JButton("Play"); private JProgressBar progression = new JProgressBar(0,100); private boolean boucle = false; private boolean fini = false; public Fenetre () { super("MonThread"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); monThread = new MonThread(this); /** Construction de la fenêtre *******/ this.progression.setMaximum(100); this.add(this.progression,BorderLayout.NORTH); JPanel boutons = new JPanel(); boutons.setLayout(new FlowLayout()); // au début play est seul actif play.setEnabled(true); stop.setEnabled(false); pause.setEnabled(false); play.addActionListener(this); stop.addActionListener(this); pause.addActionListener(this); boutons.add(play); boutons.add(pause); boutons.add(stop); this.add(boutons,BorderLayout.SOUTH); pack(); setLocationRelativeTo(null); setVisible(true); monThread.start(); } public static void main(String ...args) { javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { new Fenetre(); } }); } @Override public void actionPerformed(ActionEvent e) { if (e.getSource() == stop) stop(); else if (e.getSource() == play) play(); else if (e.getSource() == pause) pause(); } private void pause() { pause.setEnabled(false); stop.setEnabled(true); play.setEnabled(true); monThread.setEtat(Etat.PAUSE); } private void play() { if (fini) { monThread.setDebut(0); fini = false; } stop.setEnabled(true); pause.setEnabled(true); play.setEnabled(false); monThread.setEtat(Etat.PLAY); } private void stop() { fini = true; stop.setEnabled(false); pause.setEnabled(false); play.setEnabled(true); monThread.setEtat(Etat.STOP); progression(0); } @Override public void finLecture() { fini = true; if (boucle) play(); else stop(); } @Override public void progression(final int v) { SwingUtilities.invokeLater(new Runnable() { public void run() { Fenetre.this.progression.setValue(v) ; } }); } @Override public void definirDuree(int max) { this.progression.setMaximum(max); } }
Tout marche correctement à un détail prè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
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 public class MonThread extends Thread { private ObservateurLecteur observateur; private volatile Etat etat; private volatile int debut = -1; public MonThread(ObservateurLecteur ol) { super("MonThread"); this.observateur = ol; etat = Etat.STOP; } public void setDebut(int x) { debut = x; } /** * la boucle principale */ public void run() { while(true) { if(etat == Etat.PLAY) { debut += 10; try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } if ( debut <= 100) { observateur.progression(debut); } else observateur.finLecture(); } } } public void setEtat(Etat e) { etat = e; } }
Lorsque je clique sur stop la barre de progression s'affiche avec la valeur à laquelle on était rendu et non pas avec une valeur nulle malgré la ligne progression(0) qui doit mettre la valeur de cette barre à 0.
Partager