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:
Voici mon splashscreen:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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(); } } }
Et dans la console j'ai :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; } }
Pourquoi, si j'appelle Thread.Sleep(), cela me met a jour mon splashscreen
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 DEBUG - test -1 DEBUG - RUNNABLE DEBUG - Graphique revalider DEBUG - RUNNABLE DEBUG - Graphique revalider DEBUG - test 0
J'ai essayé de mettre une condition sur le thread, mais ça ne change rien
Merci de votre aide
Partager