Bonjour à tous,

Je suis en train de réaliser un projet d'application. Pendant le chargement de cette application (même s'il est relativement court), j'aimerais afficher un SplashScreen contenant une JProgressBar qui se remplit au fur et à mesure. Pour cela, j'ai créé une classe héritée de JWindow et je l'appelle depuis mon contrôleur principal, mais elle reste complètement grisée pendant le chargement. J'ai cherché des questions similaires et vu qu'il fallait mettre en place une architecture en multi-threading, c'est donc ce j'ai essayé de faire, mais sans résultat : ma fenêtre est toujours grisée pendant le chargement (une fois qu'il est fini elle s'affiche bien en revanche).

Voici le code de la fenêtre :

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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package controlers;
 
import java.awt.BorderLayout;
 
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JWindow;
 
/** Classe de la fenêtre de SplashScreen */
public class SplashView extends JWindow implements Runnable
{
 
	/**
         * UID généré par Eclipse
         */
	private static final long serialVersionUID = 5120064167466501647L;
	/** La progress bar */
	private JProgressBar bar;
 
	/** Constructeur */
	public SplashView ()
	{
		//réglages relatifs à le fenêtre
	    this.setSize(500, 213);
	    this.setLocationRelativeTo(null);      
 
	    //Instanciation du JPanel principal
	    JPanel pan = new JPanel();
 
	    //Instanciation du JPanel de l'image
	    JLabel img = new JLabel(new ImageIcon("img/splash.png"));
	    img.setVerticalAlignment(JLabel.TOP);
	    img.setHorizontalAlignment(JLabel.CENTER);
 
	    //Instanciation de la JProgressBar
	    bar = new JProgressBar();
	    bar.setMinimum(0);
	    bar.setMaximum(100);
	    bar.setValue(0);
	    bar.setStringPainted(true);
	    bar.setString("Initialisation...");
 
	    //Ajout des composants au JPanel
	    pan.setLayout(new BorderLayout());
	    pan.add(img, BorderLayout.CENTER);
	    pan.add(bar, BorderLayout.SOUTH);
 
	    //Réglages relatifs à la fenêtre
	    getContentPane().add(pan);
	    this.setAlwaysOnTop(true);
	}
 
	@Override
	public void run() 
	{
		this.setVisible(true);
        setBar(100, "Initialisation terminée !");
        try 
        {
			Thread.currentThread().sleep(3000);
		} 
 
        catch (InterruptedException e) 
		{
			e.printStackTrace();
		}
        this.dispose();
	}
 
	/** Méthode permettant de mettre à jour la valeur et le texte de la Progress bar */
	public void setBar (int val, String text)
	{
		bar.setValue(val);
		bar.setString(text);
	}
 
	/** Méthode permettant de mettre à jour seulement le texte de la progress bar */
	public void setBarString (String text)
	{
		bar.setString(text);
	}
}
Pour l'instant, comme vous le voyez, je ne mets pas ma progress bar à jour, j'essaie d'afficher correctement ma fenêtre avant.
Voici le code d'appel de ma fenêtre et du traitement qui se fait en parallèle :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
		SplashView spWin = new SplashView();
		Thread t = new Thread (spWin);
		t.start();
 
		initModel();
        fen = new MainView();
initModel() c'est le nom de la fonction qui s'occupe de charger mes modèles depuis la base de données puis ensuite j'affiche la fenêtre principale. Je souhaiterais que mon SplashScreen s'affiche pendant la chargement, puis la fenêtre principale s'affiche en arrière plan et le splashScreen s'affiche quelques secondes encore avant de disparaître. À l'heure actuelle, ça fonctionne plutôt bien mis à part que pendant le chargement le SplashScreen est tout gris.

Si jamais vous avez des idées, je suis preneur.

Je vous remercie de votre attention.