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

Applets Java Discussion :

JLabel problème de taille pour un texte multi lignes


Sujet :

Applets Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 13
    Points : 6
    Points
    6
    Par défaut JLabel problème de taille pour un texte multi lignes
    Bonjour à tous,

    Je programme une applet avec une boucle infinie, comme dans l'exemple trouvé ici :http://subaru2.univ-lemans.fr/enseig...ava/java8.html (cf 2eme exemple)

    Dans le corps de ma boucle, je modifie une variable globale de type chaine que j'affiche une fois mon traitement terminé.
    La chaine de caractère est assez longue et est sur plusieurs lignes.
    Voici le code de ma boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public void run()
      { while (true)       // boucle sans fin
        { try              //action à réaliser
           {
        	repaint();    //redessiner
            label.setText("<html>"+Result+"</html>"); //affichage de la chaine
           }  
          catch (Exception e)
          { stop();}}}  //traitement (facultatif) de l'exception
    }
    Le traitement qui modifie ma chaine Result est dans le code de ma fonction paint()

    Cependant, j'ai un bug que je ne comprends pas : lorsque j'affiche ma chaine à la fin de mon traitement, je ne vois le résultat que sur une ligne. Ce qui m'intringue, c'est que si je redimensionne la fenêtre de mon applet, je vois à présent mon JLabel correctement, avec tous les sauts à la ligne prévu.

    J'ai l'impression que la taille du JLabel ne se met pas à jour selon la chaine.
    J'ai fait des recherches sur les fonctions qui sont appelées lors du redimensionnement (pour pouvoir déclencher l'action qui m'a permet de voir le résultat attendu), mais j'ai cru comprendre qu'il s'agissait des fonctions update et paint, qui sont appelées par définition par le repaint.

    Est-ce que quelqu'un voit d'où pourrait provenir mon erreur?
    Quelqu'un sait-il quelles fonctions sont appelées lorsque l'utilisateur redimensionne la fenêtre?
    Je peux poster une version allégée (sans tout le traitement de la variable résultat) de mon code si ça peut être utile.

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    C'est le layout qui s'occupe de la dimension des composants. Appelle la méthode "revalidate" sur ton JLabel.
    Par contre, tu n'as pas fait de pause entre 2 repaint ? Ou est-ce un résumé simplifié de ton code ?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Merci beaucoup pour cette réponse rapide.

    J'ai essayé de faire un label.revalidate() après le label.setText("<html>"+Result+"</html>") mais cela ne change rien.


    Concernant la pause, il y a un Thread.sleep(20); à la fin de la boucle.

    Edit : je me suis penchée sur l'ensemble des fonctions disponibles pour un JLabel, et j'ai essayé les methodes updateUI(), validate(), repaint(), requestFocus(), paintImmediately, setMinimumSize mais sans succès. Je continue cependant mes recherches sur cette voie là.

  4. #4
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Tu utilises quel layout ?
    Donne ton code allégé.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Voici une version allégée de mon 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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
    import java.applet.*;
    import java.awt.*; 
     
    import javax.swing.*;
     
     
     
    public class appletPcSc extends Applet implements Runnable
    {  /**
             * 
             */
    	private static final long serialVersionUID = 1L;
    Thread runner = null;        //variables de classe
     
    	private JLabel label = new JLabel();
    	private String Result;
    	private Panel pc; 
     
     
     
      public void update(Graphics g)  //surcharge indispensable
      {  paint(g);}
     
      public void paint(Graphics g)
     {  			
        /* ici il y a tout mon code qui modifie ma variable globale Result */
     }
     
      public void start()      //surcharge de la méthode
      { 
    	/* dans le start j'initialise l'ensemble de mes composants graphiques */
     
           setBackground (Color.lightGray);
    	this.setSize(800,800);
     
     
            pc = new Panel();
    	pc.setSize(700, 700);
    	add(pc,"Center");
    	label.setForeground(Color.blue);
     
    	label.setSize(600,600);
    	pc.add(label, BorderLayout.CENTER);
     
    	  if (runner == null)    //test d'existence
        {  runner = new Thread(this);  //création , this désigne l'applet
           runner.start();}}  // lancement de la méthode run( )
     
    @SuppressWarnings("deprecation")
    public void stop()
     { if (runner != null)
       {  runner.stop();
          runner = null;}} //destruction
     
    public void run()
      { while (true)       // boucle sans fin
        { try              //action à réaliser
           {
        	repaint();    //redessiner
            label.setText("<html>"+Result+"</html>");
     
            Thread.sleep(20);//pause de 20 ms
           }  
          catch (Exception e)
          { stop();}}}  //traitement (facultatif) de l'exception
    }


    Pour info, la première valeur que prend Result est null (observé à l'affichage), ensuite il est sensé prendre comme valeur la fameuse chaine de caractères sur plusieurs lignes.

  6. #6
    Membre expérimenté
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 088
    Points : 1 540
    Points
    1 540
    Par défaut Une idée.
    Dans la ré-écriture de la méthode paint de votre sous-class d'Applet, est-ce qu'à la fin de la méthode vous faites un paintComponent(g)...
    Je crois que paintComponent est invoqué après paint, mais comme vous avez redéfini la méthode paint, si vous n'appelez pas vous-même paintComponent, ce dernier ne permet pas à votre BorderLayout de faire son travail de redimensionnement. Travail qui est fait lorsque vous redimensionnez votre fenêtre déclenchant ainsi le paintComponent. Enfin, je crois...

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    En effet, il n'y avait pas de paintComponent d'effectué à la fin de ma paint.

    J'ai essayé en déplacant le setText à la fin du paint et en mettant le paintComponent juste après mais dans ce cas il n'y a même pas une ligne qui apparait.

    J'ai déplacé ces deux instructions à la fin de ma fonction update mais là je retombe dans le problème initial : affichage sur une seule ligne seulement.

Discussions similaires

  1. [MySQL] Probleme d'affichage d'un texte multi-lignes
    Par incas84 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 18/06/2010, 08h50
  2. Réponses: 2
    Dernier message: 07/09/2009, 21h20
  3. Auto-scroll d'une zone de texte multi ligne
    Par malek_dz77 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 30/11/2005, 13h09

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