web-dev-qa-db-fra.com

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

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

Maintenant, je veux que mon Jlabel encapsule automatiquement le texte à la ligne suivante lorsqu'il atteint la fin de l'écran, comme la fonctionnalité "Word Wrap" dans Note Pad.

Comment puis je faire ça?

47
Jame

Devrait fonctionner si vous enveloppez le texte dans <html>...</html>

PDATE: Vous devriez probablement aussi définir la taille maximale.

29
MarianP

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

La définition de la largeur en CSS évite d'avoir à calculer où les sauts de ligne doivent se produire dans (ou la meilleure taille) de l'étiquette.

import javax.swing.*;

public class FixedWidthLabel {

    public static void main(String[] srgs) {
        final String 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 String html = "<html><body style='width: %1spx'>%1s";

        Runnable r = () -> {
            JOptionPane.showMessageDialog(
                    null, String.format(html, 200, s));
            JOptionPane.showMessageDialog(
                    null, String.format(html, 300, s));
        };
        SwingUtilities.invokeLater(r);
    }
}

enter image description hereenter image description here

92
Andrew Thompson

Une façon serait d'utiliser un JTextArea au lieu d'un JLabel avec setWrapStyleWord et setLineWrap mis à true et avec des paramètres pour le faire ressembler et se comporter comme un JLabel (supprimez la bordure, rendez-la non opaque, rendez-la non modifiable et non focalisable).

Sinon, si vous devez absolument utiliser un JLabel, vous seriez obligé d'utiliser FontMetrics pour mesurer votre texte, vérifiez les espaces blancs, puis ajoutez vous-même les coupures HTML dans les positions appropriées.

11

J'ai trouvé que cette solution est la plus simple et fonctionne également correctement avec le redimensionnement. Autre que d'habiller le texte dans <html> tags, vous devez également placer l'étiquette dans un conteneur qui respecte la hauteur préférée et définit la largeur au maximum. Par exemple, vous pouvez placer l'étiquette au 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 <html> tags et en plaçant le label au 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("<html>"
            + "<h3>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</h3>"
            + "<p>Duis a tincidunt urna. Phasellus tristique 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.</p>"
            + "<p>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 ultrices 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 ultrices posuere cubilia Curae; Vestibulum mattis, "
            + "tortor sed scelerisque laoreet, tellus neque consectetur lacus, "
            + "eget ultrices 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.</p>"
            + "</html>");

        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(String[] 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);
            }

        });
    }

}
7
Andrei Vajna II