Java - Язык:Разрывы строк в JLabels?
-
12-09-2019 - |
Вопрос
Я пытаюсь создать 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);
}