Existe-t-il une propriété «word wrap» pour JLabel?

J’affiche du texte dans un JLabel. Fondamentalement, je génère ce texte dynamicment, puis j’applique des balises HTML (par exemple, BR et B ) pour formater le texte. Enfin, j’atsortingbue ce texte formaté à mon JLabel.

Maintenant, je veux que mon Jlabel enroule automatiquement le texte sur la ligne suivante lorsqu’il atteint la fin de l’écran, comme la fonctionnalité “Retour à la ligne” dans le Bloc-notes.

Comment puis je faire ça?

Devrait fonctionner si vous enveloppez le texte dans ...

MISE À JOUR: Vous devriez probablement également définir la taille maximale, alors.

Une largeur peut être définie pour le body utilisant les styles HTML (CSS). Cela déterminera à son tour le nombre de lignes à rendre et, à partir de là, la hauteur préférée de l’étiquette.

Définir la largeur dans CSS évite d’avoir à calculer où les sauts de ligne doivent apparaître (ou la meilleure taille) de l’étiquette.

 import javax.swing.*; public class FixedWidthLabel { public static void main(Ssortingng[] srgs) { final Ssortingng s = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eu nulla urna. Donec sit amet risus nisl, a porta enim. Quisque luctus, ligula eu scelerisque gravida, tellus quam vestibulum urna, ut aliquet sapien purus sed erat. Pellentesque consequat vehicula magna, eu aliquam magna interdum porttitor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed sollicitudin sapien non leo tempus lobortis. Morbi semper auctor ipsum, a semper quam elementum a. Aliquam eget sem metus."; final Ssortingng html1 = ""; Runnable r = new Runnable() { @Override public void run() { JOptionPane.showMessageDialog( null, new JLabel(html1 + "200" + html2 + s)); JOptionPane.showMessageDialog( null, new JLabel(html1 + "300" + html2 + s)); } }; SwingUtilities.invokeLater(r); } } 

entrer la description de l'image icientrer la description de l'image ici

Une façon serait d’utiliser un JTextArea au lieu d’un JLabel avec setWrapStyleWord et setLineWrap définis sur true et avec des parameters pour le faire apparaître et se comporter comme un JLabel (supprimer la bordure, la rendre non opaque, la rendre non modifiable et non focalisable).

Sinon, si vous devez absolument utiliser un JLabel , vous serez obligé d’utiliser FontMesortingcs pour mesurer votre texte, vérifier les espaces blancs, puis append vous-même les ruptures HTML dans les positions appropriées.

J’ai trouvé que cette solution est la plus simple et fonctionne correctement avec le redimensionnement. Hormis l’encapsulation du texte dans les balises , vous devez également placer l’étiquette dans un conteneur qui respecte la hauteur préférée et définir la largeur au maximum. Par exemple, vous pouvez insérer l’étiquette dans le NORD d’un BorderLayout .

Voici un programme de travail simple mais complet pour illustrer cela. Vous pouvez redimensionner le cadre comme vous le souhaitez. l’étiquette occupera toute la largeur et la hauteur s’ajustera en conséquence pour envelopper le texte. Notez que tout ce que je fais est d’utiliser des balises et de placer l’étiquette dans le NORD du BorderLayout .

 import javax.swing.JFrame; import javax.swing.SwingUtilities; import javax.swing.JPanel; import javax.swing.JLabel; import java.awt.BorderLayout; import java.awt.Dimension; public class LabelWrap { public static JPanel createPanel() { JLabel label = new JLabel(); label.setText("" + "

Lorem ipsum dolor sit amet, consectetur adipiscing elit.

" + "

Duis a tincidunt urna. Phasellus sortingstique interdum mauris, " + "ut vestibulum purus suscipit eget. Aenean massa elit, accumsan " + "non faucibus vel, dictum placerat urna. In bibendum est sagittis " + "urna iaculis quis sagittis velit commodo. Cum sociis natoque " + "penatibus et magnis dis parturient montes, nascetur ridiculus " + "mus. Nam quis lacus mauris. Phasellus sem libero, convallis " + "mattis sagittis vel, auctor eget ipsum. Vivamus molestie semper " + "adipiscing. In ac neque quis elit suscipit pharetra. Nulla at " + "orci a tortor consequat consequat vitae sit amet elit. Praesent " + "commodo lacus a magna mattis vehicula. Curabitur a hendrerit " + "risus. Aliquam accumsan lorem quis orci lobortis malesuada.

" + "

Proin quis viverra ligula. Donec pulvinar, dui id facilisis " + "vulputate, purus justo laoreet augue, a feugiat sapien dolor ut " + "nisi. Sed semper augue ac felis ulsortingces a rutrum dui suscipit. " + "Praesent et mauris non tellus gravida mollis. In hac habitasse " + "platea dictumst. Vestibulum ante ipsum primis in faucibus orci " + "luctus et ulsortingces posuere cubilia Curae; Vestibulum mattis, " + "tortor sed scelerisque laoreet, tellus neque consectetur lacus, " + "eget ulsortingces arcu mi sit amet arcu. Nam gravida, nulla interdum " + "interdum gravida, elit velit malesuada arcu, nec aliquam lectus " + "velit ut turpis. Praesent pretium magna in nibh hendrerit et " + "elementum tellus viverra. Praesent eu ante diam. Proin risus " + "eros, dapibus at eleifend sit amet, blandit eget purus. " + "Pellentesque eu mollis orci. Sed venenatis diam a nisl tempor " + "congue.

" + ""); JPanel panel = new JPanel(new BorderLayout()); panel.add(label, BorderLayout.NORTH); panel.setPreferredSize(new Dimension(640, 480)); return panel; } /** * @param args */ public static void main(Ssortingng[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setContentPane(createPanel()); frame.pack(); frame.setVisible(true); } }); } }

Je pensais juste que je devrais poster ceci pour quiconque effectuant des recherches sur Internet, car c’était la toute petite erreur qui me coûtait 30 minutes, mais assurez-vous d’avoir bien mis le texte en HTML. Vous avez peut-être pensé que vous l’avez fait et que vous ne l’avez pas encore fait. Vérifiez-le, j’ai oublié, et quand je les ai emballés en HTML, il a été corrigé pour moi.

JLabel label = new JLabel("Lorem ipsum long paragraph"); faux.

JLabel label = new JLabel("Lorem ipsum long paragraph"); correct!

J’aime l’approche JTextArea mentionnée ci-dessus, car elle redimensionne joliment à SOUTH dans un panneau BorderLayout (tant que le composant CENTER peut prendre le relais si le nombre de lignes du JTextArea change).

Cependant, dans Nimbus L & F, il y a une difficulté à définir la couleur d’arrière-plan de JTextArea. Il semble que Nimbus utilise des couleurs magiques (classe étendue de java.awt.Color) qui deviennent transparentes dans JTextArea. Donc, si vous copiez la couleur d’arrière-plan d’un JPanel vers la zone JText, vous devez convertir le Color en ARGB et revenir à Color. Le code suivant fonctionne pour moi dans tous les L & F de mon JRE (Nimbus, CDE Motif, Metal, Mac OS X):

  JTextArea ta = new JTextArea(text); ta.setEditable(false); ta.setLineWrap(true); ta.setWrapStyleWord(true); JLabel lb = new JLabel(); Font f = lb.getFont(); ta.setFont(f.deriveFont(f.getSize2D() * 0.9f)); ta.setBorder(lb.getBorder()); ta.setBackground(new Color(lb.getBackground().getRGB(), true)); ta.setForeground(new Color(lb.getForeground().getRGB(), true)); ta.setOpaque(lb.isOpaque()); 

J’ai rendu la police un peu plus petite. Bien sûr, vous pouvez conserver la taille de la police de JLabel si vous le souhaitez.