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

82

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

благодаря

Али
источник
см. также stackoverflow.com/questions/1627048/…
Лейф Грюнвольдт 07

Ответы:

57

Нет.

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

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

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

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

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

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

Camickr
источник
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>");
demBones
источник
По какой-то причине у меня это не сработало. p-теги, следующие за заголовком, и текст не переносится. У меня отключена горизонтальная прокрутка, так что, возможно, это как-то связано с этим.
Брэм Ванрой 05
Вам не нужны теги p.
Эрик Робертсон
10

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

JXLabel label = new JXLabel(somelongtext);
label.setLineWrap(true);  
клеопатра
источник
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);
            }

        });
    }

}
Андрей Вайна II
источник
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,