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 :

Splash qui dépend de chargement


Sujet :

AWT/Swing Java

  1. #1
    Membre confirmé
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 137
    Par défaut Splash qui dépend de chargement
    Salut tout le monde,

    j'ai essayé de faire un Splash Screen pour une application ,

    voilà le code :

    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
    public class Splash extends JFrame{
     
    	private	JProgressBar progressBar;
     
      public Splash(String file){ 
     
    	    JLabel img=new JLabel(new ImageIcon(file));
    	    this.getContentPane().add(img, BorderLayout.CENTER);      
    	    progressBar=new JProgressBar();
    		progressBar.setStringPainted(true);
            progressBar.setIndeterminate(true);
            progressBar.setPreferredSize(new Dimension(556,15));
        	JPanel panProgress=new JPanel();
        	panProgress.setLayout(new BorderLayout());
        	panProgress.add(progressBar,BorderLayout.CENTER);
     
        	panProgress.setBounds(195,275,400,10);
     
        	this.getContentPane().add(panProgress,BorderLayout.SOUTH);
     
        	this.setSize(626,330);
        	this.setLocationRelativeTo(null);
        	this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
        	final int pause = 5000;         
            // thread pour fermer le splash screen      
               final Runnable closerRunner = new Runnable() {                  
               public void run() { 
                   setVisible(false);               
                   dispose();       
                 }      
              };
     
     
             Runnable waitRunner = new Runnable() {       
              public void run() {               
                try {                 
                       Thread.sleep(pause);                              
                    //lance le thread qui ferme le splash screen      
                       SwingUtilities.invokeAndWait(closerRunner);    
                   } catch (Exception e) {            
                       e.printStackTrace();  }           
                   }       
                };             
     
     
                //affiche le splash screen      
                 this.setVisible(true);           
                //lance le thread qui ferme le splash screen apres un certain temps        
                  Thread splashThread = new Thread(waitRunner, "SplashThread");    
                  splashThread.start();    
     
     
        }
     
     
    }
    comme vous voyez le splash s'affiche pour un nombre de millisecondes données , la question c'est comment je peut le lier au chargement de l'application

  2. #2
    Membre Expert
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 052
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 052
    Par défaut
    Salut,

    Comment le lancer ou comment gérer le pourcentage de la barre de progression ?

  3. #3
    Membre confirmé
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 137
    Par défaut
    salut visiwi, merci pour votre réponse ,

    en fait je veus que la gestion de pourcentage de la barre de progresssion depend de chargement de l'application

  4. #4
    Membre Expert
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 052
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 052
    Par défaut
    Cela dépend de ce que tu charge.

    Si tu es capable de connaitre le nombre total d'octets chargés, c'est cela qui détermine le max de ta progressbar, puis a chaque octets (ou régulièrement) tu met a jour la value de ta progressbar.

    Si tu ne peut pas suivre cette voie, tu peux arbitrairement, déterminer la progression. par exemple, tu as 20 fichiers à charger, 20 détermine le max de ta progressbar, puis a chaque fichiers tu met a jour la value de ta progressbar.

    Je ne vois que ça, mais peut-être y a t-il d'autre solution...

  5. #5
    Membre confirmé
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 137
    Par défaut
    merci
    j'ai trouvé comment Comment connaître la mémoire utilisable de la carte graphique dans la FAQ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // obtenir le type d'environnement graphique sous lequel tourne la JVM
    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
    // optenir le périphérique d'affichage (carte graphique)
    GraphicsDevice gs = ge.getDefaultScreenDevice();
     
    // stocke le nombre d'octets libres dans la mémoire de la carte graphique(VRAM)
    int bytes = gs.getAvailableAcceleratedMemory();
    // calcule le nombre de Kilo Octets libres dans la carte graphique
    int kbytes = bytes /1024;
    // calcule le nombre de Méga Octets libres dans la carte graphique
    int mbytes = bytes /1048576;
    Cela dépend de ce que tu charge.
    je charge une JFrame qui contient plusieurs composant , comme je veut aussi
    afficher un autre splash (comme Patientez SVP ..) lors de la connection à la base et d'afficher les données

    la FAQ : http://java.developpez.com/faq/gui/?...res_composants

  6. #6
    Membre Expert
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 052
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 052
    Par défaut
    Si c'est une frame, affiche le splash et ne met pas de progressbar, car tu n'a pas de moyen de connaitre un "temps" total.

    Quand à la mémoire graphique... je ne vois pas le rapport.

  7. #7
    Membre confirmé
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 137
    Par défaut
    merci ,

    mais si je donne au splash un temps constant par exemple 5000 ms , et le chargement se differe d'un Ordinateur à un autre , la fenetre peut s'affiché
    et le splash pas encore disposé !!

    qaund meme je vous remercie pour ces indications

  8. #8
    Membre Expert
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 052
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 052
    Par défaut
    mais si je donne au splash un temps constant par exemple 5000 ms , et le chargement se differe d'un Ordinateur à un autre , la fenetre peut s'affiché
    et le splash pas encore disposé !!
    Absolument.

    Aussi vaudrait-il mieux suivre ce schéma me semble-t-il :
    • tu affiche le splash sans aucun délai
    • tu affiche la fenêtre de ton appli
    • une fois que la fenêtre est affiché tu fait un dispose() sur ton splash, éventuellement avec un petit délai pour faire plus joli

  9. #9
    Membre confirmé
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 137
    Par défaut
    Salut,

    merci beaucoup visiwi

    j'ai déja pensé à ça ,et j'ai posé la question pour savoir si il y a une autre méthode plus performante,

    maintenant j'ai éssayer de faire ce shéma avec 2 thread ,un qui lance le splash et l'autre lance l'application , le splash a un delai de 3 secondes + le temps de chargement de l'application et une bar de progression avec un temps n'est pas determiné ,ça peut se faire par progressBar.setIndeterminate(true);

    avec ça la bar à un balayage de de gauche à droite et l'inverse ,

    donc je pense que ça est satisfaisant pour moi cosmme un débutant

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 127
    Par défaut
    Salut,
    Tu as essayé les SwingWorkers ??? C'est utile dans ton cas.
    Par exemple :
    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
    public class Main {
     
        public static void main(String... args) {
            Splash splash = new Splash();
            new SplashWorker(splash).execute();
        }
     
     
     
        public static class SplashWorker extends SwingWorker<Boolean, Boolean> {
     
            private Splash splash;
     
            public SplashWorker(Splash splash) {
                this.splash = splash;
            }
     
            @Override
            protected Boolean doInBackground() throws Exception {
                // TODO : chargement de ton application
                // les actions que tu entre ici sont exécutées dans un Thread séparé
                return true;
            }
     
     
            /**
             * Méthode appelée lorsque la méthode "doInBackground" est terminée
             */
            @Override
            protected void done() {
                splash.dispose();
            }
     
        }
     
    }
    Aussi un autre petit conseil : utilise plutot une JDialog pour ta fenetre de splash comme ça tu n'aura pas de bouton dans la barre des taches ;-)

  11. #11
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 748
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 748
    Par défaut
    Utilises-tu Java 6? Est ce que c'est une écran a afficher au démarrage de l'application?

    Si oui tu aurais peut-être intérêt à passer par la classe java.awt.SplashScreen, qui affiche le splashscreen dès le chargement de la JVM

    Par contre, ce n'est pas un composant swing, Donc je pense que tu devras faire une routine de dessin de la progressBar.

  12. #12
    Membre confirmé
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 137
    Par défaut
    Bonjour ,

    pour barbiche :

    merci pour ta réponse ,


    Tu as essayé les SwingWorkers
    non j'ai pas essayer ça ,


    Aussi un autre petit conseil : utilise plutot une JDialog pour ta fenetre de splash comme ça tu n'aura pas de bouton dans la barre des taches ;-)
    merci pour ce conseil , j'ai utilisé un JFrame pour faire tout simplement des tests , un JDialog affiche aussi le bouton de fermeture , la solution c'est d'utiliser un JWindow , marci,


    pour Uther :

    merci pour ta réponse ,

    Utilises-tu Java 6? Est ce que c'est une écran a afficher au démarrage de l'application?
    oui j'utilise java 6, et c'est une ecran de démarrage à afficher aprés que l'utilisateur soit connecté ,

    pour le moment je pense que ça suffit :



    " il manque un n dans Ordonancement je vais le corriger aprés "

    en utilisant :

    la classe lancer :


    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
     public class Lancer { 
     
    	String unite,utilisateur,passe,responsable;	
    	Connection conn;
        Splash splash;	
     
    	public Lancer(Connection conn,String unite,String utilisateur,String passe,String responsable) {  
     
     
    		      splashThread splash=new splashThread();
    		      splash.start();		     
     
    		      this.conn=conn;
    		      this.unite=unite;   
    		      this.utilisateur=utilisateur;
    		      this.passe=passe;
    		      this.responsable=responsable;
     
    		      uniteThread threadom = new uniteThread();
    		      threadom.start();
    		  }
     
    	public class splashThread extends Thread{
    		public void run() {				
    			 splash = new Splash("images\\omag\\splash.gif");	 
    		}
    	}
     
    	public class uniteThread extends Thread{
     
    		public void run() {	
     
    					  try{   
     
    					    this.sleep(3000); 
     
    					  }catch(Exception ex){}
     
    					  if(unite.equals("OMAG")) {			    		    
     
    						  OMAG omag = new OMAG(conn,utilisateur,passe,responsable);				   
    						   fermeSplash(omag.fenetre);
    					   }
     
    					    else if(unite.equals("LIEBHERR")){
     
    				    	  LIEBHERR liebherr = new LIEBHERR();
     
    				       }
     
    				    	  else if(unite.equals("POUTRELLE")){  
     
    				    	  POUTRELLE poutrelle=new POUTRELLE();
     
    				    	  }
     
    					      else if(unite.equals("QUADRA")){
     
    						     QUADRA quadra=new QUADRA();       
     
    					      }
     
    					      else if(unite.equals("STETTER")){
     
    							STETTER stetter = new STETTER();
     
    					      }
     
     
     
     
    			} // fin de la metrhode run()		
     
     
    		public void fermeSplash(face f){			
    			if(f.fen.isShowing()){ 
    			splash.setVisible(false);
    			  splash.dispose();			
    			}
    		}
     
     
    	} // fin de la classe 
     
    }
    et la class splash :

    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
    public class Splash extends JWindow{
     
    	private	JProgressBar progressBar;
     
      public Splash(String file){ 
     
    	    JLabel img=new JLabel(new ImageIcon(file));
    	    this.getContentPane().add(img, BorderLayout.CENTER); 
     
    	    progressBar=new JProgressBar();
    		progressBar.setStringPainted(true);
            progressBar.setIndeterminate(true);
            progressBar.setPreferredSize(new Dimension( this.getContentPane().getWidth(),15));
     
        	this.getContentPane().add(progressBar,BorderLayout.SOUTH); 
        	this.setSize(626,330);
        	this.setLocationRelativeTo(null);
            this.setVisible(true);
     
     
        }
     
    }

  13. #13
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 914
    Billets dans le blog
    54
    Par défaut
    Oui mais... mais j'emmets quelques doute sur l'utilisation de Thread externes pour la manipulation de composants Swing. Je te conseille de tester sur d'autres systemes (nottament Linux) de maniere a verifier que tu n'arrives pas a des blocages ou erreurs de synchro lors de l'initialisation. Cela m'etait arrive il y a plusieurs annees lors du passage de Java 1.3 a 1.4 et j'ai finallement tout changer dans ma maniere de faire des ecrans de demarrage pour ne manipuler ma JWindow que via des Timer Swing ou des SwingWorker et SwingUtilities.invokeLater().

    PS : une chose que tu peux faire est de faire un permier lancemetn avec un nombre d'etapes/temps d'attente intertermine puis de stocke le temps final dans les Preferences pour le reutiliser lors des demarrages ulterieurs. Ou alors faire une progression basee sur le nombre d'etapes d'initialisation plutot que sur le temps complet de l'initialisation elle-meme.

    PS 2 : oui l'API de Splashscreen integree depuis Java 6 est un peu du foutage de gueule et ne sert pas vraiment a grand chose quand on veut faire de la progression ou quelques effets evolues (nottament la transparence ou des fenetres irregulieres dans Java 6u10). Rien ne vaut une bonne Window/JWindow programmee soi-meme.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  14. #14
    Membre confirmé
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 137
    Par défaut
    merci beaucoup bouye pour vos remarques,

    Je te conseille de tester sur d'autres systemes (nottament Linux)
    pour le moment le seul system utilisé est Windows XP , et j'ai aucune idée sur linux , mais je dois savoir ça , étape par étape ...

    via des Timer Swing ou des SwingWorker et SwingUtilities.invokeLater().
    je vais éssayer ça ,

    merci encore fois

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/12/2008, 13h06
  2. Retourner une valeur qui dépend de plusieurs lignes
    Par oli43 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 22/10/2008, 17h00
  3. [NB 5.5] Projet qui dépend d'un autre projet
    Par gifffftane dans le forum NetBeans
    Réponses: 2
    Dernier message: 14/09/2007, 12h02
  4. [Formulaire] champ qui dépend d'un autre
    Par atlantideD dans le forum IHM
    Réponses: 1
    Dernier message: 23/04/2007, 16h09
  5. [Système] exec() qui bloque le chargement de page sous IE
    Par Ryan Sheckler dans le forum Langage
    Réponses: 6
    Dernier message: 09/01/2007, 23h02

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