53 votes

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

J'affiche du texte dans un JLabel. En fait, je génère ce texte de façon dynamique, puis j'applique certaines balises HTML (par exemple, "HTML"), BR y B ) pour mettre en forme le texte. Enfin, j'assigne ce texte formaté à mon JLabel.

Je veux maintenant que mon Jlabel fasse automatiquement passer le texte à la ligne suivante lorsqu'il atteint la fin de l'écran, comme la fonction "Word Wrap" du Bloc-notes.

Comment puis-je faire ça ?

4 votes

Juste pour info, la réponse d'Andrew est la meilleure.

0 votes

@HovercraftFullOfEels <VBG>Je savais que les captures d'écran feraient la différence!</VBG>

1 votes

Oui, je dois commencer à le faire un peu plus, mais ça aide quand même d'avoir la bonne réponse. Je suppose que je devrais apprendre un peu de HTML et de styles...

96voto

Andrew Thompson Points 108505

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

En définissant la largeur en CSS, il n'est pas nécessaire de calculer l'emplacement des sauts de ligne dans l'étiquette (ou la meilleure taille de celle-ci).

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

33voto

MarianP Points 1303

Cela devrait fonctionner si vous enroulez le texte dans <html>...</html>

UPDATE : Vous devriez probablement définir la taille maximale, aussi, alors.

0 votes

I am already wraping the text in HTML e.g <html>some text <br/> <b>some text<b> </html> Do i need to use some specific HTML Tag for wraping

0 votes

Essayez d'appeler setMaximumSize sur ce JLabel

1 votes

"<html>quelque texte <br/>" Les développeurs web se retournent dans leurs tombes. Utilisez des styles.

12voto

Une façon de procéder serait d'utiliser un JTextArea au lieu d'un JLabel con setWrapStyleWord y setLineWrap défini sur true et avec des paramètres pour le faire ressembler et se comporter comme une JLabel (supprimer la bordure, la rendre non opaque, non modifiable et non focalisable).

Sinon, si vous avez absolument besoin d'utiliser un JLabel vous seriez obligé d'utiliser FontMetrics pour mesurer votre texte, vérifier la présence d'espaces blancs, puis ajouter vous-même les coupures HTML aux endroits appropriés.

9voto

Andrei Vajna II Points 1286

J'ai trouvé que cette solution est la plus simple et qu'elle fonctionne aussi correctement avec le redimensionnement. En plus d'envelopper le texte dans <html> vous devez également placer l'étiquette dans un conteneur qui respecte la hauteur préférée et fixe la largeur au maximum. Par exemple, vous pouvez placer l'étiquette dans le NORD d'une balise 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. Remarquez que tout ce que je fais est d'utiliser <html> et en plaçant l'étiquette dans le NORD de la balise 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);
            }

        });
    }

}

0voto

Adam Gawne-Cain Points 11

J'aime l'approche de la JTextArea mentionnée ci-dessus, car elle se redimensionne bien à SUD dans un panneau BorderLayout (à condition que le composant CENTER puisse prendre le relais si le nombre de lignes de la JTextArea change).

Cependant, dans Nimbus L&F, il y a un problème pour définir la couleur de fond de la JTextArea. Il semble que Nimbus utilise des couleurs magiques (classe étendue de java.awt.Color) qui deviennent transparentes dans la JTextArea. Donc, si vous copiez la couleur d'arrière-plan d'un panneau JPanel vers la zone JText, vous devez convertir la couleur en ARGB et revenir à la couleur. Le code suivant fonctionne pour moi dans toutes 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 fait une police un peu plus petite. Vous pouvez bien sûr conserver la taille de la police de JLabel si vous le souhaitez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X