27

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

8 回答 8

50

在 setText 中使用 HTML,例如

myLabel.setText("<html><body>with<br>linebreak</body></html>");
于 2009-12-03T19:17:15.617 回答
15

如果您在 html 中设置段落宽度,则可以自动换行。

  label.setText("<html><p style=\"width:100px\">"+paragraph+"</p></html>");
于 2013-02-22T05:54:23.690 回答
10

默认情况下,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

于 2009-12-03T19:26:47.053 回答
6

您可以将 HTML 放入 JLabel 中并使用换行标记来实现此目的。

于 2009-12-03T19:17:20.297 回答
4

在 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);
于 2009-12-04T00:39:08.363 回答
3

简单,使用 HTML。Java Swing 组件虽然没有为 HTML 提供“出色”的支持,但您可以将它用于如此简单的目的。

label.setText("<html>This is first line.<br/>This is second line.</html>");
于 2013-07-11T18:14:52.750 回答
2

我没有为标签指定最大宽度,但您可以指定具体宽度。通过测量 JLabel 的当前宽度,如果 JLabel 的宽度高于我们的 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);
}
于 2010-12-12T13:32:23.517 回答
1

您可以使用 JTextArea 并禁用 TextArea,这样,您将只显示您想要的内容,而用户将无法输入

JTextArea area = new JTextArea("Here \n\n you \n\n put \n\n your \n\n text");
area.setBounds(10, 11, 500, 143);
area.setEditable(false);
yourPannel.add(area);
于 2021-11-10T23:25:41.267 回答