Problèmes sur les Threads (acte 2)
	
	
		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:
	
| 12
 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:
	
| 12
 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.