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

Java Discussion :

Afficher un élément instantanément


Sujet :

Java

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 83
    Points : 68
    Points
    68
    Par défaut Afficher un élément instantanément
    Bonjour,

    Dans mon programme, j'ai une action qui est plutôt longue a exécuter, je souhaiterais donc afficher un gif dans un window représentant un chargement durant son exécution.

    Mon soucis c'est que mon gif apparait uniquement une fois que mon programme a fini de s'exécuter et non pas des le début de son exécution comme je le voudrais.

    Voici le code de mon gif
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     class FenetreTransparente extends JWindow {
        public FenetreTransparente() {
     
            setBackground(new Color(0,0,0,0));//rend l'arriere plan transparent
            setSize(new Dimension(300,200));
            setLocationRelativeTo(null);        
            setLayout(new GridBagLayout());
            Icon icon = new ImageIcon(FenetreTransparente.class.getResource("/javagui/icon/Chargement.gif"));
            JLabel label = new JLabel(icon);        
            add(label);
        }
    }
    Voici le code ou j'ai besoin de le faire apparaitre

    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
    radioButton = new JRadioButton();
    			radioButton.addActionListener(new ActionListener() {
    				public void actionPerformed(ActionEvent arg0) {
    					FenetreTransparente gtw = new FenetreTransparente();
    			        gtw.setVisible(true);
    			        gtw.setAlwaysOnTop(true);
    			        gtw.repaint();
    			        gtw.revalidate();
     
    					if (!ping()) {					
    						lbStatut.setIcon(new ImageIcon(PanelChoixUser.class.getResource("/javagui/icon32x32/offline.png")));
    						btnController.setEnabled(false);
    						btnInstaller.setEnabled(false);
    					}
    					else
    					{
    						lbStatut.setIcon(new ImageIcon(PanelChoixUser.class.getResource("/javagui/icon32x32/online.png")));
    						cible = lesResultats[kfinal][0]; 
    						btnController.setEnabled(true);
    						btnInstaller.setEnabled(true);
    					}
    					//gtw.setVisible(false);	
     
    				}
    			});
    Ainsi je souhaiterais faire apparaitre le gif durant que le ping s’exécute mais il ne s'affiche seulement une fois que toute les actions sont finis. Pourriez vous me dire comment procéder ?

  2. #2
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Si tu effectues un traitement long dans la fonction actionPerformed, il est normal que l'IHM se fige (car cette fonction est appelée dans le contexte du thread qui se charge de l'affichage). Il faut utiliser un Thread différent et faire ton action longue dans celui-ci. Si tu veux utiliser une barre de progression, regarde du coté de la classe SwingWorker...

    Par exemple, si le traitement long est dans la fonction ping, ca donnerait un truc du genre :
    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
    radioButton.addActionListener(new ActionListener() {
    				public void actionPerformed(ActionEvent arg0) {
    					final FenetreTransparente gtw = new FenetreTransparente();
    			        gtw.setVisible(true);
    			        gtw.setAlwaysOnTop(true);
    			        gtw.repaint();
    			        gtw.revalidate();
     
                                    Thread t = new Thread(new Runnable() {
                                    public void run() {
    					if (!ping()) {					
    						lbStatut.setIcon(new ImageIcon(PanelChoixUser.class.getResource("/javagui/icon32x32/offline.png")));
    						btnController.setEnabled(false);
    						btnInstaller.setEnabled(false);
    					}
    					else
    					{
    						lbStatut.setIcon(new ImageIcon(PanelChoixUser.class.getResource("/javagui/icon32x32/online.png")));
    						cible = lesResultats[kfinal][0]; 
    						btnController.setEnabled(true);
    						btnInstaller.setEnabled(true);
    					}
    					//gtw.setVisible(false);	
                                            }
                                            });
                                            t.start();
     
    				}
    PS : je n'ai pas testé ce code donc il y a peut etre des problemes d'accolades/parenthèses mais l'idée est la
    PS 2 : Pour bien faire les choses, il faudrait changer les icones/boutons en utilisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SwingUtilities.invokeLater

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 83
    Points : 68
    Points
    68
    Par défaut
    Merci hwoarang, ta solution marche parfaitement.

    Je vais en profiter pour me documenter aussi sur SwingUtilities.invokeLater, car pour le moment j'ai toujours fait mes interfaces sans.

  4. #4
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Je ne sais pas si tu es familier avec les Thread (sinon, c'est l'occasion de demander à ton ami google ) mais le principe, c'est que tout se qui touche à l'IHM doit etre executé dans le Thread ihm (il s'appelle EDT). La raison est d'éviter d'avoir des synchronisations partout qui ralentiraient l'affichage.
    Lorsque tu utilises les Listener Swing (ActionListener, MouseListener etc..), les méthodes action sont appelées dans le contexte de l'EDT. Tu peux donc à ta guise ajouter/supprimer des elements d'un JTable, JList et manipuler ton IHM.
    Mais lorsque tu effectues un traitement long dans un autre Thread, ca se complique. En effet, il ne faut pas acceder aux éléments de l'IHM depuis un autre Thread que l'EDT (pour les raisons que j'ai dit). Du coup, l'utilisation de SwingUtilities.invokeLater est necessaire lorsqu'on touche à l'IHM (par exemple, setIcon, setEnabled, ...) car le code passé par invokeLater sera appelé dans le contexte de l'EDT.

Discussions similaires

  1. Afficher des éléments HTML dans une WindowsForm
    Par flagadda dans le forum Windows Forms
    Réponses: 3
    Dernier message: 16/04/2007, 17h31
  2. Afficher des éléments avec swing
    Par ToTo13 dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 05/04/2007, 16h45
  3. [TCD/GCD] Afficher/Masquer élément
    Par piro dans le forum Général VBA
    Réponses: 2
    Dernier message: 28/02/2007, 14h21
  4. Réponses: 2
    Dernier message: 27/12/2005, 20h09
  5. Comment afficher des éléments de même nom en 1 seule fois
    Par magic8392 dans le forum XSL/XSLT/XPATH
    Réponses: 9
    Dernier message: 27/09/2005, 11h24

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