[JPROGRESSBAR] fermeture de la fenetre principal
Bonjour à tous,
Je vous explique mon probleme : apres avoir cherché sur le net, sur la FAQ et sur le forum, je ne comprend toujours pas comment fonctionne ma JProgressBar.
Je suis dans mon interface et j'appuie sur un bouton qui va me lancer un traitement qui peut durer plusieurs minutes.
A ce moment la je decide de mettre une JProgressBar
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
public void valideModification() {
// lancement du mon thread de calcul
ValideModification valide = new ValideModification();
valide.start();
int temps = (int) (getTailleDirectory(fichierAZipper) / 2500);
// je veux lancer ma progressBar
JProgress2 pj = new JProgress2(temps, "");
pj.lanceLongTraitement();
} |
Le probleme c'est qu'à la fin de ma methode la fenetre principal se ferme. Or je voudrais que cette derniere reste ouverte jusqu'a ce que ma progresse bar se finisse. En fin de compte je voudrais que ma progresseBar se fasse dans l'EDT.
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
|
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);
}
} |
Je suis sur que c'est tres simple mais je ne trouve pas.
Le thread de traitement se lance, il lance ma progresseBar, il ferme la fenetre principal et ensuite ferme les 2 threads à la fin.
Comment lui faire dire d'attendre la fin de ma progressBar pour passer au reste.
J'espere que j'ai été clair.
Merci à vous