Java: разрывы строк в JLabels? - PullRequest
22 голосов
/ 03 декабря 2009

Я пытаюсь создать Swing JLabel с несколькими строками текста. Это добавлено просто отлично, но разрывы строк не проходят. Как мне это сделать? Или я могу просто указать максимальную ширину для JLabel и знать, что текст будет переноситься, как в div?

    private void addLegend() {
        JPanel comparisonPanel = getComparisonPanel();

        //this all displays on one line
        JLabel legend = new JLabel("MMM FFF MMM FFFO O OOM   M MMMM.\nMMM FFF MMM FFFO O OOM   M MMMM.\nMMM FFF MMM FFFO O OOM   M MMMM.\n"); 

        comparisonPanel.add(legend);        
    }

Ответы [ 7 ]

43 голосов
/ 03 декабря 2009

Использовать HTML в setText, например,

myLabel.setText("<html><body>with<br>linebreak</body></html>");
9 голосов
/ 03 декабря 2009

По умолчанию Swing не переносит текст. Если вы укажете размер для JLabel, он закрасит только ту часть текста, которая подходит, а затем добавит «...» в конец.

Как и предполагалось, вы можете использовать HTML для включения переноса строк. Однако недавно я создал собственный пользовательский интерфейс Swing UI, чтобы добиться этого, и даже больше: MultiLineLabelUI .

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

JLabel label = new JLabel("Text that'll wrap if necessary");
label.setUI(MultiLineLabelUI.labelUI);

Или в качестве альтернативы используйте пользовательский класс MultiLineLabel, который в дополнение к переносу текста поддерживает вертикальное и горизонтальное выравнивание текста.

UPDATE

Я потерял домен с исходными примерами кода. Теперь его можно просматривать на github: https://github.com/sasjo/multiline

8 голосов
/ 22 февраля 2013

Вы можете получить автоматический разрыв строки, если вы установите ширину абзаца в html.

  label.setText("<html><p style=\"width:100px\">"+paragraph+"</p></html>");
6 голосов
/ 03 декабря 2009

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

3 голосов
/ 04 декабря 2009

Как насчет использования функции обтекания в JTextArea?

    String text = "some really long string that might need to"+
                  "be wrapped if the window is not wide enough";

    JTextArea multi = new JTextArea(text);
    multi.setWrapStyleWord(true);
    multi.setLineWrap(true);
    multi.setEditable(false);

    JLabel single = new JLabel(text);

    JPanel textpanel = new JPanel(new GridLayout(2,1));
    textpanel.add(multi);
    textpanel.add(single);

    JFrame frame = new JFrame();
    frame.add(textpanel);
    frame.pack();
    frame.setVisible(true);
2 голосов
/ 11 июля 2013

Простой, используйте HTML. Компоненты Java Swing, хотя и не обеспечивают «фантастическую» поддержку HTML, вы можете использовать его для таких простых целей.

label.setText("<html>This is first line.<br/>This is second line.</html>");
0 голосов
/ 12 декабря 2010

Мне не удалось указать максимальную ширину для метки, но вы можете указать конкретную ширину. Измеряя текущую ширину JLabel, мы можем применить новое фиксированное значение, только если ширина JLabels превышает нашу maxWidth:

JLabel label = new JLabel("<html>" + myVeryLongMessage + "<html>");
int maxWidth = 400;
Dimension size = label.getPreferredSize();
if (size.width > maxWidth) {
    // Estimate the number of lines
    int lineCount = (int) Math.ceil(((double) size.width) / maxWidth);
    lineCount += 1; // Add one extra line as reserve
    size.width = maxWidth; // Apply the maximum width
    // Increase the height so that all lines will be visible
    size.height *= lineCount;
    label.setPreferredSize(size);
}
...