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

Composants Java Discussion :

[JLabel] Problème de mise à jour du contenu


Sujet :

Composants Java

  1. #1
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 995
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 995
    Points : 2 522
    Points
    2 522
    Par défaut [JLabel] Problème de mise à jour du contenu
    Bonjour,

    J'ai un petit problème qui doit être tout bête, mais comme j'ai pas trop l'habitude de Swing, ça m'empoisonne.

    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
     
     
    final JLabel result = new JLabel();
    result.setText("toto");
     
    ...
     
    if (ok) {
      result.setText(success);
      result.repaint();
      System.out.println(success);
      Thread.sleep(2000);
      System.out.println("contenu : "+result.getText());
      textField.setText("");
      result.setText("titi");
    }
    Ce qui est bizarre, c'est que le JLabel n'affiche jamais ma chaine success, mais quand j'affiche le contenu, il est bien correct. Et au bout de 2 secondes, il affiche bien "titi". Il s'agit donc manifestement d'un problème de rafraichissement, j'ai donc ajouté le repaint(), sans plus de succès. Si quelqu'un avait la solution, ça m'arrangerait énormément !

    Merci pour toute réponse !

    Environnement : Java 6 sous Windows XP.

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    Par défaut
    Salut, déjà, enlève le "final" du JLabel si tu peux et ensuite, je pense que c'est normal que ton JLabel ne s'affiche pas car tu n'as pas le temps de le voir à mon avis (mais il devrait s'afficher). En effet, tu fais un setText(success); juste après.
    Essaie donc de mettre ton Thread.sleep(2000); en début de ta boucle "if".
    De plus, tu peux enlever le repaint(), il sert pas à grand chose à mon avis.
    Bye !

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 995
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 995
    Points : 2 522
    Points
    2 522
    Par défaut
    J'ai pas dû être trop clair, j'ai l'impression. Je récapitule :

    Quand je lance mon appli, mon JLabel affiche bien "toto". Le final est nécessaire, car la partie de code avec le if est dans une classe interne et ne pourrait pas y accéder autrement.
    Ce qui ne s'affiche pas correctement, c'est justement le contenu de ma chaine success. C'est ça mon problème.
    Le repaint n'a rien arrangé, effectivement. Je ne l'ai laissé dans le code que pour éviter les réponses du type "t'as qu'à mettre repaint()"...

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

    Informations forums :
    Inscription : Février 2008
    Messages : 1 050
    Points : 1 340
    Points
    1 340
    Par défaut
    Salut,

    Etrange comportement !

    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
    import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
     
    @SuppressWarnings("serial")
    public class Go extends JFrame {
     
    	public static void main(String[] args) {
    		new Go();
    	}
     
     
    	public Go() {
    		final JLabel label = new JLabel("cliquez");
    		JButton btn = new JButton("action");
     
    		btn.addActionListener(new ActionListener() {
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				label.setText("actionPerformed");
    			}
    		});
     
    		this.add(btn,BorderLayout.NORTH);
    		this.add(label,BorderLayout.SOUTH);
     
    		this.pack();
    		this.setLocationRelativeTo(null);
    		this.setVisible(true);
    	}
    }
    Essai pour voir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    EventQueue.invokeLater(new Runnable() {
    	public void run() {
    		result.setText(success);
    	}
    });

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2008
    Messages : 50
    Points : 26
    Points
    26
    Par défaut
    et où est-elle, ta chaîne succes?

  6. #6
    Nouveau membre du Club
    Inscrit en
    Juin 2008
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 52
    Points : 38
    Points
    38
    Par défaut
    Salut

    ça serait bien d'avoir tout le code...
    Sans le voir, je pense à un problème classique de gestion des threads Swing.
    Le Thread.sleep(2000); bloque le rafraichissement graphique.
    Une fois les 2 secondes passés, les deux setText() s'exécute à la suite. Ce qui fait que "titi", qui est le dernier champ à être mis a jour s'affiche.

    Enfin plus d'info avec le code...

    Pour plus d'info sur la gestion des threads sous swing :
    http://gfx.developpez.com/tutoriel/j...ing-threading/

    a+

  7. #7
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 995
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 995
    Points : 2 522
    Points
    2 522
    Par défaut
    Effectivement, l'article a répondu à toutes mes questions. J'ai modifié mon code pour faire :

    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
     
    result.setText(failure);
    Runnable wait = new Runnable() {
      public void run() {
         try {
              Thread.sleep(2000);
              textField.setText("");
    	  result.setText("");
    	  if (input.exists()) {
    	     //input.delete();
    	  }
    	  if (output.exists()) {
    	     //output.delete();
    	  }
          } catch (Exception e) {
    	  e.printStackTrace();
          }
       }
    };
    SwingUtilities.invokeLater(wait);
    Et ça marche au poil. Merci à tous. Je vais lire le document plus attentivement et je vais sûrement apprendre plein de choses !

  8. #8
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    En fait ut n'as pas tout à fait saisi ce qu'il fallait faire.

    Le Thread.sleep ne doit absolument pas se trouver dans le runnable appelé par le SwingUtilities.invokeLater(...)

    Dans ton cas tu dois créer un Thread avec ce runnable et lancer dedans un second runnable contenant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    textField.setText("");
    result.setText("");
    au moyen de SwingUtilities.invokeLater(...)

  9. #9
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 995
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 995
    Points : 2 522
    Points
    2 522
    Par défaut
    Qu'est ce que ça changerait, exactement ?

  10. #10
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 995
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 995
    Points : 2 522
    Points
    2 522
    Par défaut
    De manière analogue, comment est-ce que je peux faire pour afficher un message avant un sleep et l'effacer après ?

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

Discussions similaires

  1. Problème de mise à jour du contenu d'un TextArea
    Par Desperados43 dans le forum Interfaces Graphiques en Java
    Réponses: 1
    Dernier message: 15/01/2011, 16h23
  2. [AC-2000] problème de mise à jour d'une requête de contenu d'une liste modifiable
    Par Deverry57 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 30/07/2010, 08h42
  3. Réponses: 3
    Dernier message: 19/07/2007, 15h46
  4. Problème de mise à jour de base de données
    Par poirier dans le forum ASP
    Réponses: 2
    Dernier message: 26/05/2004, 11h38
  5. problème de mise à jour de BD
    Par tidiane dans le forum Bases de données
    Réponses: 5
    Dernier message: 04/03/2004, 15h32

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