


/**
Pourquoi ma barre de progression se rempli d'un coup ?
-> voir truc traitement long
voici deux codes sources Java commentés.
JProgess.java = la mauvaise methode (surment la votre...)
JProgress2.java = une solution


**/



/*****> Class : JProgress
	*
	**> Auteur : Johann Heymes
	*
	**> Creation : 04 juin 2002
	*
	*
	**> Licence :
	*		Ce programme est un logiciel gratuit ,  il peut être modifié et / ou
	*	distribué en  accord avec  les termes de la licence  'GNU General Public
	*	Licence'  tel qu'elle  est publiée  par la  'Free Software Foundation  .
	*	(version 2 ou précédante).
	*		Ce programme est distribué  dans l'espoir  qu'il pourra être utile ,
	*	mais  SANS AUCUNE GARANTIE . Voir la  'GNU General Public License'  pour 
	*	plus de détail.
	*		Vous devriez avoir reçu une copie de la 'GNU General Public License'
	*	avec la distribution  de ce programme,  si non,  vous pouvez écrire à la
	*	'Free Software Foudation,  Inc.,  59 Temple Place -  Suite 330,  Boston,
	*	MA 02111-1307, USA'.
	*	ou a http://www.gnu.org/licenses/gpl.html
	*
	**> Description :
	*		Cette classe montre la mauvaise maniere d'utiliser une JProgressBar
	*	et explique pourquoi.
	*
	***/

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;


public class JProgress extends JFrame implements ActionListener
{
	private JProgressBar progress;
	private boolean isStarted;
	private JButton bouton;
	private int value;

	public JProgress ()
	{
		super ("JProgressBar");

		this.isStarted = false;
		this.value = 0;
		this.progress = new JProgressBar (0, 100);
		this.getContentPane ().add (this.progress);

		bouton = new JButton ("start");
		bouton.addActionListener (this);
		this.getContentPane ().add (bouton, BorderLayout.NORTH);

		this.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
		this.setLocation (200, 200);
		this.pack ();
		this.setVisible (true);
	}



	// methode de ActionListener appelle suite au clic sur le bouton
	public void actionPerformed (ActionEvent e)
	{
		if ( this.isStarted ) // effectue un reset
		{	this.progress.setValue (0);
			this.bouton.setText ("start");
			this.value = 0;
		}
		else // effectue le start
		{	this.bouton.setText ("reset");
			this.bouton.setEnabled (false);
			// ici on fait l'appel a la methode de longTraitement
			// rappel : nous sommes dans le processus d'evenement
			this.longTraitement (); 
		}
		this.isStarted = ! this.isStarted;
		// ca y est on a fini de gerer l'evenement on va enfin rendre la main au 
		// processus d'evenement .. il va pouvoir effectuer les rafraichissement 
		// demandé ....
	}



	public void longTraitement ()
	{	// execute la succession d'operation ... 
		// on est toujours dans le processus d'evenement ...
		for (int i = 0; i < 100; i++)
		{	this.uneOperation ();
			this.majProgress (); 
			// la methode setValue met a jour les donnees caracteristique de la JProgressBar puis appel 
			// la methode repaint pour effectue la mise a jour du rendu graphique.
			// manque de pot repaint place un evenement dans la queue de la pile d'execution du processus
			// d'evenement ... et comme on bloque ce dernier l'action de rafraichissement se fera que plutard
		}
	}

	// methode qui effectue une pause pour simuler une operation
	private synchronized void uneOperation ()
	{	try
		{	this.wait (10);
		}
		catch (InterruptedException e)
		{
		}
	}


	// methode qui met a jour la JProgressBar
	public void majProgress ()
	{	this.progress.setValue (++value);
	}


	public static void main (String argv [])
	{	new JProgress ();
	}

}