Java:JLabel 中的换行符?

Posted

技术标签:

【中文标题】Java:JLabel 中的换行符?【英文标题】:Java: Linebreaks in JLabels? 【发布时间】:2010-12-22 23:15:45 【问题描述】:

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

【问题讨论】:

【参考方案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);

【讨论】:

【参考方案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);

【讨论】:

【参考方案3】:

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

【讨论】:

@Pacerier:不,不能这样做,因为我需要在包装的文本上绘制效果。我想你可以说它以与 JTextArea 类似的方式破坏文本。 @SamuelSjöberg 链接断开MultiLineLabelUI @oliholz 链接现已更新。抱歉,拖了这么久。 你好,试了你的课,发现这个课忽略了两个以上的空格……有解决办法吗?【参考方案4】:

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

label.setText("<html>This is first line.<br/>This is second line.</html>");

【讨论】:

【参考方案5】:

在html中设置段落宽度可以自动换行。

  label.setText("<html><p style=\"width:100px\">"+paragraph+"</p></html>");

【讨论】:

【参考方案6】:

在 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);

【讨论】:

好主意,但只有一个缺点:无法格式化文本。 multi.setBackground(yourframe.getBackground()); 这将使 JTextArea 看起来像一个 JLabel。【参考方案7】:

您可以将 HTML 放在 JLabel 中并使用换行标记来实现。

【讨论】:

【参考方案8】:

在 setText 中使用 HTML,例如

myLabel.setText("<html><body>with<br>linebreak</body></html>");

【讨论】:

或者如果你想要更动态,那么你可以使用html里面的width css或者width属性,见HERE 可能值得注意: 标签是必需的。没有它们,像 这样的其他标签就不起作用。 标签不是必需的,如果你只是保持简单的话。

以上是关于Java:JLabel 中的换行符?的主要内容,如果未能解决你的问题,请参考以下文章

防止带有 html 的 JLabel 换行

如何使JLabel自动换行到下一行

如何实现Java多行文本框换行效果

组布局中的 JLabel - 冻结大小

java 怎么让JLabel和JPanel透明?

通过设置最大宽度使 JLabel 包装它的文本