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:
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:
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.