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
| package project;
import java.awt.BorderLayout;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
public class BarProg extends JDialog {
/**
*
*/
private static final long serialVersionUID = 1L;
static JProgressBar dpb;
public BarProg(JFrame parentFrame){
super(parentFrame," ",true);
dpb = new JProgressBar(0, 500);
dpb.setIndeterminate(true);
this.add(BorderLayout.CENTER, dpb);
this.add(BorderLayout.NORTH, new JLabel("Progress..."));
this.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
this.setSize(300, 75);
this.setLocationRelativeTo(parentFrame);
}
static void lcmt(final BarProg barProg){
Thread t = new Thread(new Runnable() {
public void run() {
// on force l'appel sur l'EDT, sans que le thread courant ne soit bloqué (le setVisible(true) va bloquer l'appel, puisque le dialogue est modal)
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
barProg.setVisible(true); // on affiche le dialogue (comme il est modale, ça bloque le thread courant)
}
});
// la boucle d'attente est faite en dehors de l'EDT pour ne pas bloquer l'affichage (et éventuellement d'autres composants SWING dont on voudrait pouvoir se servir pendant la progression)
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
}
// on ferme le dialogue sur l'EDT, ce qui garanti qu'il soit bien fermé après avoir été ouvert (enfin normalement ça devrait être le cas, même si on l'exécutait dans le thread courant, puisqu'il y a peu de risque que SWING rame pendant 5 secondes avant d'afficher le dialogue, mais on ne sait jamais)
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
barProg.setVisible(false); // on ferme (on cache) le dialogue
barProg.dispose(); // si on ne sert plus du dialogue, autant libérer les ressources associées
}
});
}
});
t.start(); // lance le thread, qui affiche le dialogue, qui attend 5 s avant de refermer le dialogue
}
} |
Partager