Alors cela fait deux jours que je bloque sur un problème de JProgressBar, j'ai regardé beaucoup d'exemples sur l'API ou encore sur beaucoup de forums mais sans succès. Quand j'essaie leurs exemples seuls, ça fonctionne mais dès que je l'intègre à mon programme rien ne fonctionne.
Alors pour faire simple, je veux faire une bar de progression dans une nouvelle fenêtre que celle en cours par le biais d'un SwingWorker. Or ça va pas ! La nouvelle fenêtre s'ouvre bien, mais elle est gélée dès qu'une partie de programme principal s'éxécute ...
Je vais essayer de faire simple dans le code :
/**
*
Programme principal ...
*
**/
SwingWorker travail1 = new SwingWorker() {
@Override
protected Object doInBackground() throws Exception {
test_barre barre = new test_barre( );
return null;
}
};
travail1.run();
/**
Traitement qui gèle le SwingWorker ci dessus
*
*
***
Suite du programme principal
***
*
**/
Une chose qu'il faut savoir, c'est que le code ci-dessus correspond à une classe de mon projet, elle hérite de ActionListener, PropertyChangeListener, WindowListener. Donc je sais pas si le terme de programme principal est approprié ...
N'hésitez pas à me dire si je ne suis pas clair sur certain point, je me rends pas forcément compte. Merci d'avance.
Annexe :
Code de test_barre ( trouvé sur internet ) :
package vue;
import java.awt.BorderLayout;
import java.awt.Cursor;
import java.awt.Insets;
import java.awt.LayoutManager;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.List;
import java.util.Random;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingWorker;
public class test_barre {
public test_barre( ) {
final JProgressBar progressBar = new JProgressBar(0, 10);
final CounterTask task = new CounterTask();
task.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
if ("progress".equals(evt.getPropertyName())) {
progressBar.setValue((Integer) evt.getNewValue());
}
}
});
JButton startButton = new JButton("Start");
startButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
task.execute();
}
});
JButton cancelButton = new JButton("Cancel");
cancelButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
task.cancel(true);
}
});
JPanel buttonPanel = new JPanel();
buttonPanel.add(startButton);
buttonPanel.add(cancelButton);
JPanel cp = new JPanel();
LayoutManager layout = new BoxLayout(cp, BoxLayout.Y_AXIS);
cp.setLayout(layout);
cp.add(buttonPanel);
cp.add(progressBar);
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(cp);
frame.pack();
frame.setVisible(true);
}
}
class CounterTask extends SwingWorker<Integer, Integer> {
int DELAY = 1000;
@Override
protected Integer doInBackground() throws Exception {
int i = 0;
int count = 10;
while (!isCancelled() && i < count) {
i++;
publish(new Integer[] { i });
setProgress(count * i / count);
Thread.sleep(DELAY);
}
return count;
}
protected void process(List<Integer> chunks) {
System.out.println(chunks);
}
@Override
protected void done() {
if (isCancelled())
System.out.println("Cancelled !");
else
System.out.println("Done !");
}
}
Bon une solution bourrin qui marcherait à coup sûr serait évidemment de mettre ton code principal dans un thread... ou celui de ta barre de progression.
Sinon, je crois qu'il faut de toute façon mettre le code de ton SwingWorker dans un Runnable comme ceci:
Est-ce que le SwingWorker va s’exécuter tout seul comme auparavant ? Ou il faut appeler le Runnable avec une méthode de SwingUtilities ?
Problème SWING - JProgressBar
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.