Подтвердить что ты не робот

Java: Линии в JLabels?

Я пытаюсь создать 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);        
    }
4b9b3361

Ответ 1

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

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

Ответ 2

По умолчанию 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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

Мне не удалось указать максимальную ширину для метки, но вы можете указать ширину бетона. Измеряя текущую ширину JLabel, мы можем применить только новое фиксированное значение, если ширина 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);
}