[Java] JLabel wrap

Résolu
Bonjour,

J'aimerais réaliser un JScrollPane avec un JLabel dont le texte retourne à la ligne en fin de ligne, mais j'ai quelques problèmes.
J'ai essayé un
JLabel jl = new JLabel("<html>Mon texte qui devrait retourner à la ligne à la fin de chaque mot mais qui, finalement, ne fonctionne pas</html>");
JScrollPane jsp = new JScrollPane(jl, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER););
myFrame.add(jsp);
Mais rien à faire, le texte de mon JLabel ne revient pas à la ligne...

Quelqu'un aurait une solution ?

Merci d'avance !

--
N'oubliez pas de marquer la discussion comme résolue dès que c'est le cas ! -> En haut de la page, Statut: Résolu
Attention aussi à bien respecter la 6e règle de la charte : 
Rédiger les messages dans un langage clair sans abréviation, style télégraphique ou mode SMS
Configuration: HP DV5 1123ef

3Go de RAM
Core 2 Duo 2GHz
NVidia 9600M GT

3 réponses

  1. Salut, toi :-)

    Est-ce que tu peux te permettre d'insérer des <br> ponctuels? C'est ce que je fais, je n'ai pas réussi moi non plus à avoir un retour auto à la ligne...

    (I) Je n'ai pas testé à limiter les dimensions des JLabel (via max / preferred size), têtre comme ça...

    ++
    1. Non, je peux pas vraiment me permettre d'ajouter des <br> à la fin de chaque ligne, la taille de la fenêtre étant calculée par rapport à la résolution de l'écran...
      Et j'ai essayé avec le setSize(), mais rien à faire...

  2. Quel est l'effet d'un max size défini ? La JLabel ne respecte pas la dimension ou bien tronque le texte?
    1. Ca ne respecte pas la dimension, le JLabel s'étend jusqu'à la fin de la phrase, même si ça dépasse la fenêtre.
      Mais je viens de trouver une fonction en or :
      private void wrapLabelText(JLabel label, String text) {
      	FontMetrics fm = label.getFontMetrics(label.getFont());
      	Container container = label.getParent();
      	int containerWidth = container.getWidth();
       
      	BreakIterator boundary = BreakIterator.getWordInstance();
      	boundary.setText(text);
       
      	StringBuffer trial = new StringBuffer();
      	StringBuffer real = new StringBuffer("<html>");
       
      	int start = boundary.first();
      	for (int end = boundary.next(); end != BreakIterator.DONE;
      		start = end, end = boundary.next()) {
      		String word = text.substring(start,end);
      		trial.append(word);
      		int trialWidth = SwingUtilities.computeStringWidth(fm,
      			trial.toString());
      		if (trialWidth > containerWidth) {
      			trial = new StringBuffer(word);
      			real.append("<br>");
      		}
      		real.append(word);
      	}
       
      	real.append("</html>");
       
      	label.setText(real.toString());
      }
      

      Source: https://www.geekyramblings.net

      Ca marche nickel, merci à lui !