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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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 : 44
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    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 ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre averti
    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
    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 : 44
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Tu utilises quel layout ?
    Donne ton code allégé.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  5. #5
    Membre averti
    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
    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 Expert
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 097
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 097
    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...
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

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