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]Lui donner la taille occupée par le texte


Sujet :

Composants Java

  1. #1
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut [JLabel]Lui donner la taille occupée par le texte
    Bonsoir à tous,

    je suis en train de faire une petite applet de texte défilant pour mon site.

    Aucun problème pour la mettre en place, mais cela se corse lorsque j'essaie d'ajouter des fonctionnalités.

    Elle fonctionne comme ceci: j'ai un tableau qui stocke plusieurs chaines de caractères. La première chaine est placée dans un JLabel, que je déplace verticalement avec la méthode setLocation (le container parent a un layout null) à intervalles réguliers. Une fois arrivé en position extrême, je change la chaine du label, le replace en position de départ et recommence mon déplacement.

    Mon problème est que, puisque la taille de chaque chaine et son formatage sont variables, et qu'elle peut même s'étendre sur plusieurs lignes, je dois trouver un moyen pour connaitre la taille occupée par le texte.

    J'ai essayé d'implémenter le fonctionnement suivant: lors du changement de chaine de caractère, je place de façon temporaire le label dans un container (non affiché à l'écran) muni d'un FlowLayout. Ensuite, je le retire et le replace dans mon applet. Normalement, le FlowLayout devrait redimensionner automatiquement mon label en fonction de son contenu, mais cela ne fonctionne pas...

    Je ne suis pas sûr que tout le monde m'ait compris mais... Est-ce que quelqu'un a une idée ? ou une explication ?

    d'avance

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2004
    Messages : 48
    Points : 58
    Points
    58
    Par défaut
    Tu peux calculer toi-même la taille de ton label en utilisant les FontMetrics.

    Pour plus de détails, regarde la méthode getPreferredSize() de BasicLabelUI.

    - Colargol

  3. #3
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Citation Envoyé par colargol70
    Tu peux calculer toi-même la taille de ton label en utilisant les FontMetrics.
    en es-tu sûr ? j'y ai pensé, mais n'ai pas testé, car une chaine peut être formatté grâce à l'html dans un JLabel... et donc sa taille peut sensiblement changer par rapport à la police d'origine du label...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JLabel lab = new JLabel("<html><h1>Un titre...</h1></html>", JLabel.CENTER);
    donc dans ce cas-là, la police d'origine du label n'est pas celle utilisée pour l'affichage...

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2004
    Messages : 48
    Points : 58
    Points
    58
    Par défaut
    Non en effet. FontMetrics ne s'applique bien sûr que si tu utilises la propriété "Font" du composant, pas dans le cas du HTML.

    - Colargol

  5. #5
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    donc on en revient au point de départ...

    une autre idée ?

  6. #6
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut Re: [JLabel]Lui donner la taille occupée par le texte
    Bonjour,

    Citation Envoyé par Pill_S
    je place de façon temporaire le label dans un container (non affiché à l'écran) muni d'un FlowLayout.[...]Normalement, le FlowLayout devrait redimensionner automatiquement mon label en fonction de son contenu, mais cela ne fonctionne pas...
    Non, c'est le BorderLayout qui fait prendre au contrôle tout la place disponible.





    Enjoy yourself !

  7. #7
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut Re: [JLabel]Lui donner la taille occupée par le texte
    Citation Envoyé par bigboomshakala
    Non, c'est le BorderLayout qui fait prendre au contrôle tout la place disponible.
    vi, je sais

    mon but n'est pas de lui faire prendre toute la place disponible, mais uniquement celle nécessaire à l'affichage du texte !

    --> FlowLayout dans un Container masqué --> ajout du JLabel dedans --> devrait se redimensionner tout seul --> puis je le retire et l'ajoute au contentPane de mon applet --> donc mon label devrait avoir la bonne taille...

    mais 'a marche pôô... snif !

  8. #8
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    j'ai éventuellement une solution. Ton applet ne sert qu'à afficher le texte défilant ? Tu peux essayer d'écrire le texte à même le panel, et tu modifies MESSAGE_X pour faire défiler le texte.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class MessagePanel extends JPanel
    {  
       public void paintComponent(Graphics g)
       {  
          super.paintComponent(g);
          g.drawString("Mon message est visible en entier quelque soit sa taille...", MESSAGE_X, MESSAGE_Y);
       }
     
       public static final int MESSAGE_X = 75;
       public static final int MESSAGE_Y = 100;
    }


    Enjoy yourself !

  9. #9
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    oui, c'est d'ailleur comme cela que je faisais dans les versions précédentes

    seulement, es-tu sûr que le message sera affiché en entier quelle que soit sa taille ? comment cela réagit en cas de dépassement ? saut de ligne automatique ? ha! j'y pense, j'ai oublié de préciser que le texte défile verticalement !

    de toute façon cette solution ne me convient pas vraiment, car je perd la possibilité de (facilement) centrer le texte et de le formatter grâce à l'html...

    si vous voulez mieux vous faire une idée de comment cela se passe, vous pouvez aller voir ici: http://tek.no-ip.biz/hmc2
    Par rapport à la version placée sur mon site, j'aimerais juste ajouter la possibilité de faire des blocs de texte d'une hauteur variable...

    en tt K, pour votre aide !


  10. #10
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    ah ok, maintenant je vois ce que tu essaies de faire. je vais y réfléchir.

    pour ma solution, le texte s'affiche entier à condition que la taille de la fenêtre le permette. il n'y a pas de retour à la ligne automatique et pas de possiblité de formatage HTML

  11. #11
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    Yo,

    Désolé, j'ai oublié d'y penser dans la journée.
    Je t'ai bidouillé un truc. Je dimensionne le JLabel à la taille du panel (donc il prend toute la place de ton applet). J'estime la hauteur d'une ligne de texte normal.

    un vecteur avec les messages
    un vecteur avec le nombre de lignes occupés par les messages
    (si on écrit en gros, il faut compter X lignes normales par ligne en gros caractères, X est à estimer)

    lorsque le haut du label à dépasser le haut du panel d'une hauteur égale à celle du nombre de lignes du message, alors on repositionne le label en bas, on change le message et on recommence.

    si tu n'as pas compris ma bidouille, on voit ça dans la journée


    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
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    import javax.swing.*;
    import java.awt.event.*;
     
    public class MaBidouille
    {
       public static void main(String[] args)
       {
          LabelFrame frame = new LabelFrame();
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.setVisible(true);
       }
    }
     
    class LabelFrame extends JFrame
    {
       public LabelFrame()
       {
          setTitle("NotHelloWorld");
          setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
     
          LabelPanel panel = new LabelPanel();
          getContentPane().add(panel);
       }
     
       private static final int DEFAULT_WIDTH = 300;
       private static final int DEFAULT_HEIGHT = 200;
    }
     
    class LabelPanel extends JPanel
    {
        public LabelPanel()
        {
            setLayout(null);
            label = new JLabel();
            add(label);
     
            mess = new String[3];
            mess[0] ="Ce message tient sur une ligne";
            mess[1] ="<html>Ici je m'étale<br>C'est pour tester</html>";
            mess[2] ="<html><h2>TEST<br>Sur 3 lignes<br>et en très gros</h2></html>";
     
            nbLines = new int[3];
            nbLines[0] = 1;
            nbLines[1] = 2;
            nbLines[2] = 6; // texte gras double
            index = -1;
     
            label.setVerticalAlignment(JLabel.TOP);
            label.setHorizontalAlignment(JLabel.CENTER);
            label.setBounds(0,DEFAULT_HEIGHT,DEFAULT_WIDTH,DEFAULT_HEIGHT);
     
            int delay = 10;
            ActionListener taskPerformer = new ActionListener()
            {
                public void actionPerformed(ActionEvent evt)
                {
                    if (label.getY()==DEFAULT_HEIGHT)
                    {
                        index = (index<mess.length-1) ? index+1 : 0 ;
                        label.setText(mess[index]);                    
                    }
     
                    int x = label.getX();
                    int y = label.getY()<-LINEHEIGHT*nbLines[index] ? DEFAULT_HEIGHT : label.getY()-1;
     
                    label.setLocation(x,y);                
     
                    revalidate();
                }
            };
            new Timer(delay, taskPerformer).start();
        }
     
        private JLabel label;
        private int index;
        private String[] mess;
        private int[] nbLines;
     
        private static final int LINEHEIGHT = 12;
        private static final int DEFAULT_WIDTH = 300;
        private static final int DEFAULT_HEIGHT = 200;
    }


    Enjoy yourself !

  12. #12
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Ah ok, j'ai compris

    pas mal, je pense que je vais garder ton idée... mais quand même l'améliorer un peu ! Ce serait quand même bien de calculer la hauteur des chaines de manière dynamique...

    Le but étant de fournir pour les utilisateurs de l'applet un fonctionnement le plus simple possible... genre ils ne passent qu'un seul paramètre, où toutes les sous-chaines sont séparées par des points-virgules, et l'applet se débrouille toute seule:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <applet code="..." width=100 height=100>
      <param name="letexte" value="toto;tata;<html><h2>Bla bla blal</h2><br>tutititi...;...</html>">
      <!-- RIEN D'AUTRE ! -->
    </applet>
    mais ça je devrait pouvoir m'en sortir en bidouillant un peu avec les classes String et StringTokenizer

    donc on peut dire que le problème est résolu !

  13. #13
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    Citation Envoyé par Pill_S
    Ce serait quand même bien de calculer la hauteur des chaines de manière dynamique...
    Entièrement d'accord !

    D'ailleurs si tu peux me passer le code si tu trouves ? ça m'intéresse.



    Enjoy yourself !

  14. #14
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    ouais, pas de souci

    pour l'instant je suis parti sur un truc bien bourrin, mais ça devrait marcher :
    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
     
    pour chaque sous-chaine de la chaine principale
      si (commence par <html> et fini par </html>)
        // *****formattée en html*******
     
        // extraction des lignes
        somme = 0;
        découper la chaine à chaque balises <br> et récupérer dans un tableau
        pour chacune de ces chaines 
          regarder le formatage en fonction des balises <hN>, <b>, <i>, ...
          déterminer hauteur de la ligne (pas facile)
          ajouter à la somme 
        fin_pour
        hauteur sous-chaine = somme
      sinon
        // *****pas formattée html*****
     
        hauteur sous-chaine = hauteur d'une ligne du JLabel
      fin_si
    fin_pour
    avec mon pseudo code, il y a quand même certaines limitations, du genre chaque balise <br> ne doit pas couper une autre balise... sinon, attention aux problèmes...

    au lieu d'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <html><h2>Salut<br>toto</h2></html>
    il faudra certainement écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <html><h2>Salut</h2><br><h2>toto</h2></html>
    mais bon, pour moi ça me suffit, les possibilités principales sont quand mêmes là... et les contraintes sont encore dans le domaine du raisonnable


  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2004
    Messages : 48
    Points : 58
    Points
    58
    Par défaut
    Désolé pour la réponse tardive. J'ai enfin un peu de temps à consacrer à ton problème

    Je reviens sur mes paroles: ce n'était pas si bête ce que je proposais, à savoir de zieuter l'implémentation de BasicLabelUI.getPreferredSize()!

    Si tu débugges, tu vas voir que BasicLabelUI.getPreferredSize(), afin de calculer la taille du label, prends en compte la propriété "html" (voir méthode SwingUtilities.layoutCompoundLabelImpl()). Il utilise BasicHTML$Renderer.getPreferredSpan(). Tu peux t'en inspirer pour calculer la taille de ton label, sans avoir à l'afficher à l'écran.

    - Colargol

  16. #16
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    ok Colargol ! merci pour le conseil, je pense que cela va être plus adapté d'utiliser ta solution

    j'ai récupérer le code de la classe BasicHTML, mais pour tout te dire je bloque un peu sur le fonctionnement même en lisant la doc de fond en comble (elle n'est pas vraiment très fournie) je ne comprend pas trop ce que je dois faire pour récupérer la taille

    la seule méthode qui me semblerait adaptée est la "public static View createHTMLView(JComponent c, String html)", mais je ne comprend pas trop à quoi correspond l'objet "View" qui me vient en retour ni comment l'utiliser...

    est-ce que tu pourrais me donner un exemple d'utilisation ? ou au moins me dire si je pars sur la bonne voie ?

    ce serait vraiment le top si tu pouvais me filer encore un petit coup de pouce

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2004
    Messages : 48
    Points : 58
    Points
    58
    Par défaut
    (Suis au bureau là et mon chef râle si je passe trop de temps à faire ce genre de trucs Vais voir ce w-e si je trouve un moment pour jeter un coup d'oeil ).

    - Colargol

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2004
    Messages : 48
    Points : 58
    Points
    58
    Par défaut
    Ok j'ai regardé et...




    c'est super simple !!!

    Voilà ce qu'il te faut faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tonLabel.setSize(tonLabel.getUI().getPreferredSize(tonLabel));
    C'est tout ! Ton label aura ainsi sa "preferred size", sans avoir à l'afficher, et quelque soit son contenu!

    Enjoy!

    - Colargol

  19. #19
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    tout simplement génial !

    ah bah j'aurais su... je t'aurais pas tant embeté !

    en tout cas, merci beaucoup, tu me sors une fière chandelle du pied


    @+

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2004
    Messages : 48
    Points : 58
    Points
    58
    Par défaut
    Ben de manière générale en programmation: les solutions les meilleures sont les plus simples. Inutile de vouloir réinventer la roue à chaque fois... 8)

    - Colargol

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. tailles occupées par tinytext et autres
    Par bitben dans le forum Débuter
    Réponses: 11
    Dernier message: 11/03/2013, 17h01
  2. [AIX ksh] Trouver la taille occupée par utilisateur
    Par Alqualonde dans le forum AIX
    Réponses: 3
    Dernier message: 17/05/2010, 10h50
  3. calculer la taille réellement occupée par un fichier
    Par d_idaho dans le forum VBScript
    Réponses: 1
    Dernier message: 05/03/2007, 16h14
  4. Réponses: 9
    Dernier message: 26/08/2006, 20h35
  5. Réponses: 3
    Dernier message: 28/06/2005, 10h07

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