【发布时间】:2010-11-25 12:27:11
【问题描述】:
我想要多行格式的JLabel 文本,否则文本会太长。我们如何在 Java 中做到这一点?
【问题讨论】:
我想要多行格式的JLabel 文本,否则文本会太长。我们如何在 Java 中做到这一点?
【问题讨论】:
如果您不介意将标签文本包装在html 标记中,JLabel 会在其容器的宽度太窄而无法容纳所有内容时自动换行。例如,尝试将其添加到 GUI,然后将 GUI 调整为太窄 - 它会换行:
new JLabel("<html>This is a really long line that I want to wrap around.</html>");
【讨论】:
我建议创建您自己的自定义组件,在包装时模拟 JLabel 样式:
import javax.swing.JTextArea;
public class TextNote extends JTextArea {
public TextNote(String text) {
super(text);
setBackground(null);
setEditable(false);
setBorder(null);
setLineWrap(true);
setWrapStyleWord(true);
setFocusable(false);
}
}
然后你只需调用:
new TextNote("Here is multiline content.");
如果您想pack() 正确计算父组件的高度,请确保设置行数 (textNote.setRows(2))。
【讨论】:
setOpaque(false);setFont(UIManager.getFont("Label.font"));
我建议使用 JTextArea 而不是 JLabel
在您的 JTextArea 上,您可以使用方法 .setWrapStyleWord(true) 更改单词末尾的行。
【讨论】:
可以在 HTML 中use (basic) CSS。
【讨论】:
具有自动调整高度的多行标签。 在标签中换行
private void wrapLabelText(JLabel label, String text) {
FontMetrics fm = label.getFontMetrics(label.getFont());
PlainDocument doc = new PlainDocument();
Segment segment = new Segment();
try {
doc.insertString(0, text, null);
} catch (BadLocationException e) {
}
StringBuffer sb = new StringBuffer("<html>");
int noOfLine = 0;
for (int i = 0; i < text.length();) {
try {
doc.getText(i, text.length() - i, segment);
} catch (BadLocationException e) {
throw new Error("Can't get line text");
}
int breakpoint = Utilities.getBreakLocation(segment, fm, 0, this.width - pointerSignWidth - insets.left - insets.right, null, 0);
sb.append(text.substring(i, i + breakpoint));
sb.append("<br/>");
i += breakpoint;
noOfLine++;
}
sb.append("</html>");
label.setText(sb.toString());
labelHeight = noOfLine * fm.getHeight();
setSize();
}
谢谢, Jignesh Gothadiya
【讨论】: