JWindow grisée malgrè le multi-threading
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:
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:
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.