сделайте JLabel обернуть его текстом, установив максимальную ширину


82

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

благодаря


Ответы:


57

Нет.

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

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

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

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

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

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


14
Это не совсем так. Если вы используете HTML, вы можете жестко закодировать теги разрыва, но если вы используете HTML и назначите максимальный размер, текст будет автоматически перенесен.
— Daniel Rikowski

2
Если вы решили жестко разорвать теги кода, убедитесь, что вы используете <br>, а не <br />, поскольку Java 5 не любит последний.
— Craigo

мне нравится вторая идея, потому что первая может разбить слово пополам, а я хочу перенос слов
— shareef

«Вы можете использовать HTML в ярлыке, но тогда вы должны жестко закодировать тег прерывания». Это не правильно. CSS может указать предпочтительную ширину, тогда строка будет автоматически переноситься по слову на столько строк, сколько необходимо.
— Эндрю Томпсон

45

Да, есть два похожих способа (первый с 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);

5
Использование html для переноса текста похоже на взлом, но это самый простой способ заставить его работать. Установка размера в div - это именно то, что мне нужно, чтобы обернуть JLabel максимальной шириной без каких-либо сторонних библиотек или чрезмерно сложных хаков.
— Питер Дольберг,

6
Что делать, если размер окна изменится? Текст должен быть переформатирован в соответствии с новой шириной метки, но с этим решением вам придется установить его снова.
— Андрей Черненко

1
</html>кстати :)
— Jiří

36

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

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

С JDK 7 этого было достаточно, спасибо! JLabel lblTitle = new JLabel("<html>My very very very long title text</html>");
— Matthieu

4
Если вы это сделаете, вы должны myStringсначала экранировать любые HTML-объекты . Если myStringэто что-то вроде «Значение <5», оно будет отображаться как «Значение 5».
— Rangi Keen

13

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

JLabel biglabel = new JLabel("<html><p>A lot of text to be wrapped</p></html>");

По какой-то причине у меня это не сработало. p-теги, следующие за заголовком, и текст не переносится. У меня отключена горизонтальная прокрутка, так что, возможно, это как-то связано с этим.
— Брэм Ванрой 05

Вам не нужны теги p.
— Эрик Робертсон


7

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

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);

7

Помимо обертывания текста <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

<html>упаковка работает, но не во всех случаях. Если родительский контейнер использует FlowLayout, это не сработает. Поэтому я установил его в BoxLayout. Посмотрите на этот фрагмент кода:

javax.swing.JPanel pRefundNote = new javax.swing.JPanel(); 
javax.swing.JLabel lbNote = new javax.swing.JLabel();

pRefundNote.setAlignmentX(0.0F); 
pRefundNote.setMaximumSize(new java.awt.Dimension(32767, 33)); 
pRefundNote.setLayout(new javax.swing.BoxLayout(pRefundNote, javax.swing.BoxLayout.X_AXIS)); 

lbNote.setText("<html>Select items using Shift or Ctrl and Up/Down keys or Mouse</html>"); 
lbNote.setVerticalAlignment(javax.swing.SwingConstants.TOP);
lbNote.setVerticalTextPosition(javax.swing.SwingConstants.TOP); 
pRefundNote.add(lbNote);

Не добавляйте, <br>потому что это нарушит ваш текст, даже если вы увеличите родительский фрейм и контейнер pRefundNote.


-7

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

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

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

Это не перенос текста.
— SapuSeven,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.