сделать JLabel обернуть его текст, установив максимальную ширину - PullRequest
78 голосов
/ 11 марта 2010

У меня есть JLabel, на котором много текста. Есть ли способ заставить JLabel иметь максимальную ширину, чтобы он обернул текст, чтобы он не превышал эту ширину?

Спасибо

Ответы [ 8 ]

48 голосов
/ 11 марта 2010

Нет.

Вы можете использовать HTML в метке, но тогда вам нужно жестко закодировать тег разрыва.

Лучше всего использовать JTextArea и включить перенос. Вы можете изменить фон, передний план, шрифт и т. Д. Текста, чтобы он выглядел как метка.

Обратите внимание, что этот ответ устарел как минимум на Java 7.

Согласно ответу @ darren, вам просто нужно обернуть строку тегами <html> и </html>:

myLabel.setText("<html>"+ myString +"</html>");

Вам не нужно жестко кодировать какие-либо теги разрыва. Текст переносится при изменении размера компонента.

46 голосов
/ 07 июля 2010

Да, есть два аналогичных способа (первый с помощью css style = "width: ... px", второй с html WIDTH = .......:

1

labelText = String.format("<html><div style=\"width:%dpx;\">%s</div></html>", width, text);

2

labelText = String.format("<html><div WIDTH=%d>%s</div></html>", width, text);
35 голосов
/ 16 ноября 2011

или просто используйте

myLabel.setText("<html>"+ myString +"</html>");
11 голосов
/ 16 ноября 2011

JXLabel в проекте SwingX поддерживает перенос

JXLabel label = new JXLabel(somelongtext);
label.setLineWrap(true);  
10 голосов
/ 29 февраля 2012

Вы можете использовать HTML без жесткого кодирования тегов разрыва, если вместо этого используете теги абзаца.

JLabel biglabel = new JLabel("<html><p>A lot of text to be wrapped</p></html>");
7 голосов
/ 15 ноября 2011

Хорошая техника здесь , прокрутите до конца статьи.

JLabel labelBeingUsed = myLabel;
View view = (View) labelBeingUsed.getClientProperty(BasicHTML.propertyKey);
view.setSize(scrollPane1.getWidth(), 0.0f);
float w = view.getPreferredSpan(View.X_AXIS);
float h = view.getPreferredSpan(View.Y_AXIS);
labelBeingUsed.setSize((int) w, (int) h);
6 голосов
/ 14 марта 2012

Кроме переноса текста в теги <html>, вы также должны поместить этикетку в контейнер, который учитывает предпочтительную высоту и устанавливает ширину на максимум. Например, вы можете поставить метку на СЕВЕР BorderLayout.

Вот простая, но полная рабочая программа, чтобы проиллюстрировать это. Вы можете изменить размер фрейма любым удобным вам способом; метка будет занимать всю ширину, а высота будет регулироваться соответственно, чтобы обернуть текст. Обратите внимание, что все, что я делаю, - это использование тегов <html> и размещение метки на СЕВЕРЕ 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);
            }

        });
    }

}
0 голосов
/ 17 сентября 2013

Если вы хотите использовать только JLabel, чем вы можете попробовать этот подход,

просто отобразите количество символов, которое вы хотите отобразить на метке, используя метод подстроки.

public void setLabel(String label){
    String dispLabel=label.substring(0, numOfCharacter);
    labelComponent.setText(dispLabel);
}
...