IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

JWindow grisée malgrè le multi-threading


Sujet :

AWT/Swing Java

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 3
    Points : 3
    Points
    3
    Par défaut 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 : 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.

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 074
    Points : 7 978
    Points
    7 978
    Par défaut
    On ne manipule pas les composants graphiques hors du thread de L'EDT c'est probablement pour cela que ca "bloque".

    http://gfx.developpez.com/tutoriel/j...ing-threading/

    Mais en executant ton code, meme sans respecter ce que je viens de dire, cela fonctionne chez moi. (mais je n'appelle pas initmodel() qui contient peut etre ce qui permet de reproduire facilement le problème chez moi)

    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
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    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;
     
    	public static void main(String args[]) throws InterruptedException{
    		SplashView spWin = new SplashView();
    		Thread t = new Thread (spWin);
    		t.start();
     
    		Thread.sleep(3000);
        //    fen = new MainView();
    	}
     
    	/** 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);
    		for (int i = 0; i < 100; i++)
    		{
    			setBar(i, "Initialisation terminée !");
    			try 
    	        {
    				Thread.currentThread().sleep(300);
    			} 
    	        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);
    	}
    }
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Merci pour ta réponse.

    J'ai montré mon code à ma prof de Java et elle ne sait pas non plus du tout d'où peut venir l'erreur.

    J'ai essayé l'approche inverse, à savoir laisser le splashscreen dans le thread principal et créer une nouvelle classe héritée de Thread qui appelle la fonction initModel, mais ça ne fonctionne pas du tout et n'initialise pas mes modèles alors je suis revenu sur cette manière de faire que j'avais trouvée sur le net.

    Le code dans initModel() fait appel à la bibliothèque Javassist (http://www.csg.ci.i.u-tokyo.ac.jp/~chiba/javassist/) qui génère des classes dynamiques à partir d'entités de ma base de données. Je ne peux malheureusement pas le fournir car il fait plusieurs centaines de lignes réparties dans une bonne dizaine de classes différentes et utilise une base de données que je n'ai pas le droit de sortir de mon école.

    Penses-tu que c'est l'usage de cette bibliothèque qui compromet le fonctionnement de mon programme ?

    Ce n'est pas une fonctionnalité essentielle de mon programme, mais en tant que débutant en Java, j'aimerais bien comprendre comment régler ce problème.

    Je te remercie de ton aide.

Discussions similaires

  1. Interface bloquée malgré multi-thread
    Par JuTs dans le forum Windows Presentation Foundation
    Réponses: 8
    Dernier message: 12/06/2010, 00h30
  2. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  3. Réponses: 16
    Dernier message: 30/01/2004, 11h05
  4. [VB6][active x] faire du multi-thread avec vb
    Par pecheur dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 20/05/2003, 12h01
  5. [Kylix] exception qtinft.dll et multi-threading
    Par leclaudio25 dans le forum EDI
    Réponses: 3
    Dernier message: 27/03/2003, 18h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo