Problème lié à l'appel de Thread.sleep()
Bonjour,
J'utilise la méthode SwingWorker, seulement si j'utilise Thread.sleep()
Cette méthode me met a jour mon splashscreen.
Voici mon code:
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
| //SwingWorker
class MonSwingWorker extends SwingWorker<Integer, String> {
Graphics g=splash.getGraphics();
public MonSwingWorker() {
/* On ajoute un écouteur de barre de progression. */
addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
if("progress".equals(evt.getPropertyName())) {
progressBar.setValue((Integer) evt.getNewValue());
}
}
});
}
@Override
/* Code a exécuter dans un Thread séparé (un long calcul par exemple) */
public Integer doInBackground() {
try {
return getNombreDeTraitement(0, 100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return 0;
}
}
private Integer getNombreDeTraitement( double progressStart, double progressEnd) throws InterruptedException {
int nb = 0;
model = new Model();
System.out.println("test -1");
Thread.sleep(1000);
System.out.println("test 0");
}
@Override
/* Permet de récupérer les résultats partiels du traitement dans l'EDT publié dans la méthode publish */
protected void process(List<String> strings) {
for(String s : strings){
splash.setChargement(s);
System.out.println("test im");
splash.update(g);
}
}
@Override
protected void done() {
try {
/* Le traitement est terminé. */
setProgress(100);
/* À la fin du traitement, affichage du programme. */
fen_splash.setVisible(false);
Fenetre fen = new Fenetre(model);
fen.setVisible(true);
} catch(Exception e) {
e.printStackTrace();
}
}
} |
Voici mon splashscreen:
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
| public class SplashScreen extends JPanel{
BufferedImage image = null;
private String chargement="";
private Rectangle rectangle;
public SplashScreen(Image image, Rectangle rectangle) {
this.image = (BufferedImage) image;
this.rectangle=rectangle;
}
/**
* @param image
* @uml.property name="image"
*/
public void setImage(BufferedImage image){
this.image = image;
}
public Image getImage(BufferedImage image){
return image;
}
public void paint(Graphics g){
if(Thread.currentThread().getState()!=Thread.State.WAITING){
System.out.println(Thread.currentThread().getState());
if(image.getColorModel().hasAlpha()){
try{
Robot robot = new Robot();
BufferedImage fond = robot.createScreenCapture(rectangle);
MediaTracker tracker = new MediaTracker(this);
tracker.addImage(fond,0);
tracker.waitForAll();
g.drawImage(fond, 0,0,null);
}catch(Exception e){e.printStackTrace();}
}
g.drawImage(image,0,0,null);
//Font font = new Font("Courier", Font.BOLD, 14);
//g.setFont(font);
g.setColor(Color.WHITE);
g.drawString(chargement, 20, 280);
System.out.println("Graphique revalider");
}
}
public String getChargement() {
return chargement;
}
public void setChargement(String chargement) {
this.chargement = chargement;
}
} |
Et dans la console j'ai :
Code:
1 2 3 4 5 6
| DEBUG - test -1
DEBUG - RUNNABLE
DEBUG - Graphique revalider
DEBUG - RUNNABLE
DEBUG - Graphique revalider
DEBUG - test 0 |
Pourquoi, si j'appelle Thread.Sleep(), cela me met a jour mon splashscreen
J'ai essayé de mettre une condition sur le thread, mais ça ne change rien
Merci de votre aide ;)