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
|
public class JProgress2 extends Thread {
private JProgressBar progress;
private JFrame frame;
private int value;
private int temps;
/**
* constructeur de la classe
*
* @param temps :
* nombre de seconde pdt laquelle je veux que ma progressBar
* s'affiche
*/
public JProgress2(int temps, String s) {
frame = new JFrame(s);
this.value = 0;
this.temps = temps * 10;
this.progress = new JProgressBar(0, 100);
this.progress.setStringPainted(true);
frame.getContentPane().add(this.progress);
frame.setSize(250, 75);
Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
frame.setLocation(dim.width / 2 - frame.getWidth() / 2, dim.height / 2
- frame.getHeight() / 2);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
// cree un nouveau Thread et appelle la methode start
// Cf une documentation sur les Thread si vous ne comprennez pas le
// mecanisme ....
public void lanceLongTraitement() {
start();
// maintenant nous rendons la main au processus d'evenement
}
// methode de l'interface Runnable
// lance un nouveau thread qui va executer le code de la methode
// longTraitement
public void run() {
System.out.println("thread progress bar");
longTraitement();
}
public void longTraitement() { // execute la succession d'operation ...
// on est plus dans le processus d'evenement mais dans le nouveau Thread
for (int i = 0; i < 100; i++) {
uneOperation();
// maintenant on appelle la methode pour mettre a jour la barre
// de progression
majProgress();
}
frame.dispose();
}
// methode qui effectue une pause pour simuler une operation
private synchronized void uneOperation() {
try {
wait(temps);
} catch (InterruptedException e) {
}
}
// methode qui met a jour la JProgressBar par le processus d'evenement
// Pourquoi obliger l'execution de cette methode par le processus
// d'evenement ?
// -> Cf : la docs du tutoriel de Sun section : "Threads and Swing"
// http://java.sun.com/docs/books/tutorial/uiswing/mini/threads.html
public void majProgress() {
if (SwingUtilities.isEventDispatchThread()) {
progress.setValue(++value);
} else {
Runnable callMAJ = new Runnable() {
public void run() {
majProgress();
}
};
SwingUtilities.invokeLater(callMAJ);
}
} |
Partager