Вопрос

Я пытаюсь создать 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);        
    }
Это было полезно?

Решение

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

myLabel.setText("<html><body>with<br>linebreak</body></html>");

Другие советы

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

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

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

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

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

Обновить

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

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

  label.setText("<html><p style=\"width:100px\">"+paragraph+"</p></html>");

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

Как насчет использования функции переноса в 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);

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

label.setText("<html>This is first line.<br/>This is second line.</html>");

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

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);
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top