我正在尝试使用多行文本制作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);
}
答案 0 :(得分:43)
在setText中使用HTML,例如
myLabel.setText("<html><body>with<br>linebreak</body></html>");
答案 1 :(得分:9)
默认情况下,Swing不会换行文本。如果在JLabel上指定一个大小,它将只绘制适合的文本部分,然后在末尾添加“...”。
根据建议您可以使用HTML启用换行。但是,我实际上不久前创建了一个自定义Swing UI委托来实现这一目标甚至更多:MultiLineLabelUI。
它将包装您的文本以适应可用空间并且还尊重硬线断点。如果您选择尝试,它就像:
JLabel label = new JLabel("Text that'll wrap if necessary");
label.setUI(MultiLineLabelUI.labelUI);
或者使用自定义MultiLineLabel
类,除了包装文本外,还支持垂直和水平文本对齐。
<强>更新强>
我使用原始代码示例丢失了域名。现在可以在github上查看它:https://github.com/sasjo/multiline
答案 2 :(得分:7)
如果在html中设置段落宽度,则可以获得自动换行符。
label.setText("<html><p style=\"width:100px\">"+paragraph+"</p></html>");
答案 3 :(得分:6)
您可以将HTML放在JLabel中并使用linebreak标记来实现此目的。
答案 4 :(得分:3)
如何在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);
答案 5 :(得分:1)
简单,使用HTML。 Java Swing组件虽然没有为HTML提供“梦幻般的”支持,但您可以将它用于这么简单的目的。
label.setText("<html>This is first line.<br/>This is second line.</html>");
答案 6 :(得分:0)
我没有设法为标签指定最大宽度,但您可以指定具体宽度。 通过测量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);
}