Java:JLabels中的换行符?

时间:2009-12-03 19:14:35

标签: java user-interface swing jlabel

我正在尝试使用多行文本制作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);        
    }

7 个答案:

答案 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);
}