Java Swing:多行标签?

57

可能有重复:
如何在JLabel中显示多行文本?

我想做这件事:

JLabel myLabel = new JLabel();
myLabel.setText("This is\na multi-line string");

目前这会导致一个显示标签

This isa multi-line string

我希望它可以做到这个:

This is
a multi-line string

有什么建议吗?

谢谢


编辑:已实施的解决方案

在方法体中:

myLabel.setText(convertToMultiline("This is\na multi-line string"));

辅助方法:

public static String convertToMultiline(String orig)
{
    return "<html>" + orig.replaceAll("\n", "<br>");
}

在 SWT 中,标签对象是否可以实现? - Michał Ziober
7个回答

73

您可以在 JLabels 中使用 HTML。要使用它,您的文本必须以 <html> 开头。

将您的文本设置为 "<html>This is<br>a multi-line string" ,然后它就可以工作了。

有关更多信息,请参见Swing教程:JLabel多行标签(HTML)


21
public class JMultilineLabel extends JTextArea{
    private static final long serialVersionUID = 1L;
    public JMultilineLabel(String text){
        super(text); // According to Mr. Polywhirl, this might improve it -> text + System.lineSeparator()
        setEditable(false);  
        setCursor(null);  
        setOpaque(false);  
        setFocusable(false);  
        setFont(UIManager.getFont("Label.font"));      
        setWrapStyleWord(true);  
        setLineWrap(true);
        //According to Mariana this might improve it
        setBorder(new EmptyBorder(5, 5, 5, 5));  
        setAlignmentY(JLabel.CENTER_ALIGNMENT);
    }
} 

我感觉看起来一模一样,只是很丑陋


1
这一点也不丑!最终,我通过让我的组件扩展JScrollPane(它又包装了一个像你这里配置的JTextArea一样的组件)来构建它。将其包装在JScrollPane中允许该组件在被调整为较大的宽度后收缩回去。 - matt forsythe
2
感谢您提供有用的答案!为了使它更美观,您还可以删除线框,添加插图并垂直居中对齐:setBorder(new EmptyBorder(5, 5, 5, 5)); setAlignmentY(JLabel.CENTER_ALIGNMENT); - Mariana
我不得不调用 super(text + System.lineSeparator()); 来防止标签底部被截断。 - Mr. Polywhirl

7
另一种简单的方法(但会略微改变文本样式)是使用<pre></pre> html块。如果您使用的字符串来自用户输入框,则这将保留用户输入的任何格式。示例:
JLabel label = new JLabel("<html><pre>First Line\nSecond Line</pre></html>"); 

1
不错的发现。但必须提到,这也会更改字体(为等宽字体),这并不总是所期望的。 - Display Name

5

JLabel可以接受HTML代码。也许你可以尝试使用<br>标签。

示例:

JLabel myLabel = new JLabel();
myLabel.setText("<html> This is a <br> multi-line string </html>");

5
在jlabel中编写多行文本的直接方法是:
JLabel label = new JLabel("<html>First Line<br>Second Line</html>"); 

5
JLabel或任何Swing组件中使用HTML的问题在于,您必须使用HTML样式,而不是通常的setFontsetForeground等样式。如果您可以接受这一点,那就没问题了。
否则,您可以使用JIDE的MultilineLabel,它扩展了JTextArea。它是他们开源的Commom Layer的一部分。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接