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 :

GIF wait ne se lance pas au bon moment


Sujet :

AWT/Swing Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2013
    Messages : 29
    Points : 21
    Points
    21
    Par défaut GIF wait ne se lance pas au bon moment
    Bonjour,
    je suis confronté au problème suivant, j'ai crée une interface qui ne sert qu'a afficher un GIF affichant WAIT avec une petite animation.
    Voici 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
     
    package menus;
     
    import java.awt.Dimension;
    import javax.swing.ImageIcon;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
     
    public class WaitGif extends JFrame {
     
     
    	    JPanel contentPane;
    	    JLabel imageLabel = new JLabel();
     
    	    public WaitGif() {
    	        try {
    	            //setDefaultCloseOperation(EXIT_ON_CLOSE);
    	            contentPane = (JPanel) getContentPane();
    	           // contentPane.setLayout(new BorderLayout());
    	            setSize(new Dimension(500, 280));
     
    	            ImageIcon ii = new ImageIcon(this.getClass().getResource("wait.gif"));
    	            imageLabel.setIcon(ii);
    	            contentPane.add(imageLabel, java.awt.BorderLayout.CENTER);
    	            // show it
    	            this.setLocationRelativeTo(null);
    	            this.setUndecorated(true);
    	            this.setAlwaysOnTop(true);
    	            this.setVisible(true);
    	        } catch (Exception exception) {
    	            exception.printStackTrace();
    	        }
    	    }
     
     
    }
    Celui-ci fonctionne

    Par contre, je fais appel à lui depuis un bout de code juste après l'ouverture d'une fenêtre de dialogue pour indiquer l'emplacement d'un fichier.
    Ce que je veux c'est qu'une fois le chemin indiqué cette image s'affiche le temps de la génération du document qui est un html que j’ouvre ensuite.
    En pratique elle s'affiche bien mais après la génération du document ce qui est bien trop tard et ne sert plus rien

    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
     
                                    JFileChooser fileChooser = new JFileChooser();
    				fileChooser.setDialogTitle("choisir l'emplacement ou stocker le fichier");
     
     
     
    				int userSelection = fileChooser.showSaveDialog(this);
     
     
     
     
    				//if (userSelection == JFileChooser.APPROVE_OPTION) {
    					scheminexport  = fileChooser.getSelectedFile().toString() + ".html";
    					File file = new File(scheminexport);
     
    					//}
    					//ecran animé pour patienter le temps de la génération
    					WaitGif wait = new WaitGif();
     
     
     
    				//je récupère la liste des patients et je fait un tableau par patient tant que j'ai des patients sur cette date
    					String schambre ="";
    					String slocalisation ="";
    					String snom ="";
    					String sprenom ="";
    					String scommentaire ="";
    					String sreservediet ="";
    					String sportion="";
    					String stexture="";
     
    Etc.
    generation d'un html et ouverture de celui-ci
    J'ai un peu fouillé sur le net : mes pistes vont vers la création d'un thread pour ouvrir la fenêtre de GIF. Mais je ne suis pas sûr d'aller dans la bonne direction car ma tentative avec un thread n'a pas changé le résultat.

    Si vous avez déjà été confronté à cette problématique je suis preneur de vos conseils.

    Merci

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    En fait c'est tout le traitement que tu dois faire dans un thread, et tout ce qui est graphique doit être délégué au thread swing par SwingUtilities.invokeLater(). Regarde SwingWorker qui te permettra de simplifier l'implémentation.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2013
    Messages : 29
    Points : 21
    Points
    21
    Par défaut
    merci beaucoup, je vais creuser cette piste là.
    Bonne soirée

  4. #4
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2013
    Messages : 29
    Points : 21
    Points
    21
    Par défaut test avec invokelater
    Bonjour,
    j'ai creusé le sujet de l'utilisation de SwingUtilities.invokeLater()
    Je suis arrivé à afficher dès le début de mon traitement la fenêtre qui contient le GIF, mais malheureusement l’animation ne commence qu'une fois le traitement fini

    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
     
     
     new Thread(new Runnable() {
                                   public void run() {
                                        //gif annimé c'est lui qui doit m'afficher mon wait annimée
                                        final WaitGif wait = new WaitGif();
     
                                     SwingUtilities.invokeLater(new Runnable() {
                                       public void run() {
                                         //tout le reste du traitement
                                        ////////////////////////
                                       code 
                                       code
    ////////////////////////////////////////////////////
                 //fin de l'attente du gif animé
                  wait.dispose();
     
     
       r
                                       }
                                     });
                                   }
                               }).start();
    Le gif est animé de la façon suivante :

    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
     
     
    public class WaitGif extends JFrame {
     
     
    	    JPanel contentPane;
    	    JLabel imageLabel = new JLabel();
     
    	    public WaitGif() {
    	        try {
    	            //setDefaultCloseOperation(EXIT_ON_CLOSE);
    	            contentPane = (JPanel) getContentPane();
    	           // contentPane.setLayout(new BorderLayout());
    	            setSize(new Dimension(500, 280));
     
    	            ImageIcon ii = new ImageIcon(this.getClass().getResource("wait.gif"));
    	            imageLabel.setIcon(ii);
    	            contentPane.add(imageLabel, java.awt.BorderLayout.CENTER);
    	            // show it
    	            this.setLocationRelativeTo(null);
    	            this.setUndecorated(true);
    	            this.setAlwaysOnTop(true);
    	            this.setVisible(true);
    	        } catch (Exception exception) {
    	            exception.printStackTrace();
    	        }
    	    }
     
     
    }
    Si vous voyez ou j'ai fait mon erreur vous savez quoi faire

    Merci

  5. #5
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Bah, oui, parce que je t'ai dit qu'il fallait faire l'inverse.

    Le traitement dans un thread non SWING, l'affichage dans l'Event Dispatch Thread (le thread SWING). Là, tu fais l'inverse.

    Je suppose que ton code est dans un ActionListener à la base :

    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
    public void actionPerformed(ActionEvent e) {
     
         final WaitGif wait = new WaitGif();
     
         new Thread() {
     
               public void run() {
     
                     // traitement parallélisé (hors SWING)
     
                      ...
     
                    // fin du traitement
                    SwingUtilities.invokeLater(new Runnable() {
                       public void run() {
                            wait.dispose();
                       }
                    });
     
               }
     
         }.start();
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2013
    Messages : 29
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Bah, oui, parce que je t'ai dit qu'il fallait faire l'inverse.

    Le traitement dans un thread non SWING, l'affichage dans l'Event Dispatch Thread (le thread SWING). Là, tu fais l'inverse.

    Je suppose que ton code est dans un ActionListener à la base :

    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
    public void actionPerformed(ActionEvent e) {
     
         final WaitGif wait = new WaitGif();
     
         new Thread() {
     
               public void run() {
     
                     // traitement parallélisé (hors SWING)
     
                      ...
     
                    // fin du traitement
                    SwingUtilities.invokeLater(new Runnable() {
                       public void run() {
                            wait.dispose();
                       }
                    });
     
               }
     
         }.start();
     
    }

    Merci beaucoup ! ça marche Nikel
    Je l'avais aussi fait dans l'autre sens mais j'avais du faire une boulette quelques part car cela n'avait pas marché, du coup je m'étais dis que j'avais mal compris les docs que j'avais trouvé sur le sujet. (il faudra que je les relise...) . En tout cas grâce à ton aide et en reprenant tout de zéro ça m'a permis de tout faire fonctionner parfaitement.
    Merci encore pour ton aide,
    Bonne fin de semaine

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

Discussions similaires

  1. Bootloader qui ne lance pas le Kernel
    Par Jb59 dans le forum Programmation d'OS
    Réponses: 2
    Dernier message: 01/08/2005, 22h29
  2. mmc.exe qui ne se lance pas
    Par r0d dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 27/04/2005, 17h11
  3. [Kylix] Ne se lance pas sous Fedora core 3
    Par John@EuroDevz dans le forum EDI
    Réponses: 3
    Dernier message: 14/02/2005, 16h27
  4. Mysql ne se lance pas problème de socket
    Par Riko dans le forum Installation
    Réponses: 5
    Dernier message: 05/02/2004, 09h28
  5. Envoi d'un mail en VBA: outlook ne se lance pas
    Par Hannibal dans le forum VBA Access
    Réponses: 4
    Dernier message: 01/06/2003, 15h24

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