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.
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);
	}
}
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
 
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;
	}
}
Tout marche correctement à un détail près.
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.