package testspaddy; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.List; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.SwingWorker; /** * * @author Paddy */ public class myJFrame extends JFrame implements ActionListener { private JLabel jlab = null; private JButton jbtn = null; private JProgressBar jpb = null; // Gere la duree de ma longue tache (repete un processus long un certain nombre de fois). // Cette variable est utilisee notamment pour definir la valeur maxi de la progress bar private int times = 10; public myJFrame() { super(); build(); } public void build() { Dimension size = new Dimension(300, 80); this.setPreferredSize(size); this.setResizable(false); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jbtn = new JButton("Launch"); jbtn.addActionListener(this); jpb = new JProgressBar(); jpb.setMaximum(times); jpb.setStringPainted(true); JPanel jpRight = new JPanel(new GridLayout(2, 1)); jpRight.add(jbtn); jpRight.add(jpb); this.add(jpRight); this.pack(); } @Override public void actionPerformed(ActionEvent e) { // C'est la que ca se joue... // Quand on clique sur le bouton (j'ai supprime les tests pour plus de clarte) SwingWorker worker = new SwingWorker() { @Override protected Object doInBackground() throws Exception { // Cree une instance de longue tache final LongTask lt = new LongTask(times); // Ce premier thread lancera l'execution de la longue tache Thread tLaunch = new Thread(new Runnable() { public void run() { lt.longLaunch(); } }); // Ce second thread verifiera toutes les 100ms la progression de la longue tache Thread tGetProgress = new Thread(new Runnable() { public void run() { while (lt.isOver() == false) { publish(lt.getProgress()); try { Thread.sleep(100); } catch (Exception e) { // ... } } publish(lt.getProgress()); } }); tLaunch.start(); tGetProgress.start(); tLaunch.join(); tGetProgress.join(); return null; } @Override protected void process(List progress) { // Recupere l'avancement et met a jour l'interface (progress bar) Integer currentValue = (Integer) progress.get(0); jpb.setValue(currentValue); } }; worker.execute(); } }