设置最大宽度使JLabel自动换行

84

我有一个JLabel上面有很多文本。有没有办法使JLabel具有最大宽度,以便它可以自动换行,以避免超出此宽度?

谢谢


如何在Java GUI上添加多行标签,参见https://dev59.com/e0nSa4cB1Zd3GeqPSvy_ - Leif Gruenwoldt
10个回答

65

不可以。标签中可以使用HTML,但是你必须硬编码换行符。

更好的方法是使用JTextArea并打开换行。你可以改变文本区域的背景、前景、字体等,使其看起来像标签。

请注意,截至Java 7这个回答已经过时。

根据@darren的答案,你只需要用<html></html>标记将字符串包装起来即可:

myLabel.setText("<html>"+ myString +"</html>");

您不需要硬编码任何换行标签。当组件大小调整时,文本会自动换行。


15
这并不完全正确。如果使用HTML,您可以硬编码换行标签,但如果您使用HTML并分配最大尺寸,则文本将自动换行。 - Daniel Rikowski
2
如果您决定硬编码断点标记,请确保使用< br>而不是< br / >,因为Java 5不喜欢后者。 - Craigo
我喜欢第二个想法,因为第一个可能会将单词分成两半,而我想要的是自动换行。 - shareef
1
“你可以在标签中使用HTML,但是那样你必须硬编码换行标签。”这是错误的。CSS可以指定首选宽度,然后字符串将自动换行为单词,并分成需要的行数。 - Andrew Thompson

50

有两种类似的方法可以设置元素宽度:第一种是使用CSS样式属性"width:...px",第二种是使用HTML属性WIDTH=......:

1.

labelText = String.format("<html><div style=\"width:%dpx;\">%s</div></html>", width, text);

2.

labelText = String.format("<html><div WIDTH=%d>%s</div></html>", width, text);

6
使用HTML来实现文本换行的整个过程感觉像是一种技巧,但这是最简单的使其正常工作的方法。在div中设置大小正是我需要的,可以使JLabel具有最大宽度并且不需要任何第三方库或过于复杂的技巧。 - Peter Dolberg
7
如果窗口大小发生变化,文本必须根据新的标签宽度重新排列,但使用这个解决方案,您需要再次进行设置。 - Andrii Chernenko
1
</html> 顺便说一句 :) - Jiří

37
或者简单地使用。
myLabel.setText("<html>"+ myString +"</html>");

有了JDK 7就足够了,谢谢!JLabel lblTitle = new JLabel("<html>我的非常非常长的标题文本</html>"); - Matthieu
4
如果你要这样做,你应该确保 myString 中的任何 HTML 实体首先被转义。如果 myString 的内容类似于“Value < 5”,它将会显示为“Value 5”。 - Rangi Keen

13

如果使用段落标签而不是硬编码的换行标签,您可以在不使用换行标签的情况下使用HTML。

JLabel biglabel = new JLabel("<html><p>A lot of text to be wrapped</p></html>");

由于某些原因,这对我没有起作用。标题后面的p标签和文本没有被包裹。我已经禁用了水平滚动,所以可能与此有关。 - Bram Vanroy
您不需要p标签。 - Erick Robertson

11

SwingX项目中的JXLabel支持换行

JXLabel label = new JXLabel(somelongtext);
label.setLineWrap(true);  

9
除了用<html>标签包装文本之外,您还需要将标签放入一个容器中,该容器尊重首选高度并将宽度设置为最大。例如,您可以将标签放置在BorderLayout的NORTH位置。
以下是一个简单但完整的工作程序,以说明这一点。您可以按任意方式调整框架的大小;该标签将占用整个宽度,并相应地调整高度以包裹文本。请注意,我所做的所有事情都是使用<html>标签并将标签放置在BorderLayout的NORTH位置。
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.JPanel;
import javax.swing.JLabel;
import java.awt.BorderLayout;
import java.awt.Dimension;

public class LabelWrap {

    public static JPanel createPanel() {
        JLabel label = new JLabel();
        label.setText("<html>"
            + "<h3>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</h3>"
            + "<p>Duis a tincidunt urna. Phasellus tristique interdum mauris, "
            + "ut vestibulum purus suscipit eget. Aenean massa elit, accumsan "
            + "non faucibus vel, dictum placerat urna. In bibendum est sagittis "
            + "urna iaculis quis sagittis velit commodo. Cum sociis natoque "
            + "penatibus et magnis dis parturient montes, nascetur ridiculus "
            + "mus. Nam quis lacus mauris. Phasellus sem libero, convallis "
            + "mattis sagittis vel, auctor eget ipsum. Vivamus molestie semper "
            + "adipiscing. In ac neque quis elit suscipit pharetra. Nulla at "
            + "orci a tortor consequat consequat vitae sit amet elit. Praesent "
            + "commodo lacus a magna mattis vehicula. Curabitur a hendrerit "
            + "risus. Aliquam accumsan lorem quis orci lobortis malesuada.</p>"
            + "<p>Proin quis viverra ligula. Donec pulvinar, dui id facilisis "
            + "vulputate, purus justo laoreet augue, a feugiat sapien dolor ut "
            + "nisi. Sed semper augue ac felis ultrices a rutrum dui suscipit. "
            + "Praesent et mauris non tellus gravida mollis. In hac habitasse "
            + "platea dictumst. Vestibulum ante ipsum primis in faucibus orci "
            + "luctus et ultrices posuere cubilia Curae; Vestibulum mattis, "
            + "tortor sed scelerisque laoreet, tellus neque consectetur lacus, "
            + "eget ultrices arcu mi sit amet arcu. Nam gravida, nulla interdum "
            + "interdum gravida, elit velit malesuada arcu, nec aliquam lectus "
            + "velit ut turpis. Praesent pretium magna in nibh hendrerit et "
            + "elementum tellus viverra. Praesent eu ante diam. Proin risus "
            + "eros, dapibus at eleifend sit amet, blandit eget purus. "
            + "Pellentesque eu mollis orci. Sed venenatis diam a nisl tempor "
            + "congue.</p>"
            + "</html>");

        JPanel panel = new JPanel(new BorderLayout());
        panel.add(label, BorderLayout.NORTH);
        panel.setPreferredSize(new Dimension(640, 480));
        return panel;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() { 
                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setContentPane(createPanel());
                frame.pack();
                frame.setVisible(true);
            }

        });
    }

}

8

这里有一个很好的技巧,请滚动到文章末尾查看。

JLabel labelBeingUsed = myLabel;
View view = (View) labelBeingUsed.getClientProperty(BasicHTML.propertyKey);
view.setSize(scrollPane1.getWidth(), 0.0f);
float w = view.getPreferredSpan(View.X_AXIS);
float h = view.getPreferredSpan(View.Y_AXIS);
labelBeingUsed.setSize((int) w, (int) h);

1
这对我来说完美地起作用。虽然不是真正的文字换行,但它可以使文本居中。基于这里的答案,我使用了align属性并设置为center在此处了解更多关于align标签的信息
label.setText("<html><p align=\"center\">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p></html>")

我的项目截图 (我还不能发布图片。很抱歉。希望这有所帮助。)


0

<html> 包装在某些情况下有效,但并非所有情况都适用。如果父容器使用 FlowLayout,则无法正常工作。因此,我将其设置为 BoxLayout。请查看此代码片段:

javax.swing.JPanel pRefundNote = new javax.swing.JPanel(); 
javax.swing.JLabel lbNote = new javax.swing.JLabel();

pRefundNote.setAlignmentX(0.0F); 
pRefundNote.setMaximumSize(new java.awt.Dimension(32767, 33)); 
pRefundNote.setLayout(new javax.swing.BoxLayout(pRefundNote, javax.swing.BoxLayout.X_AXIS)); 

lbNote.setText("<html>Select items using Shift or Ctrl and Up/Down keys or Mouse</html>"); 
lbNote.setVerticalAlignment(javax.swing.SwingConstants.TOP);
lbNote.setVerticalTextPosition(javax.swing.SwingConstants.TOP); 
pRefundNote.add(lbNote);

不要添加<br>,因为即使您放大父框架和pRefundNote容器,它也会破坏您的文本。


-7

如果您只想使用JLabel,可以尝试这种方法,

只需使用substring方法在标签上显示要显示的字符数即可。

public void setLabel(String label){
    String dispLabel=label.substring(0, numOfCharacter);
    labelComponent.setText(dispLabel);
}

这不是文本换行。 - SapuSeven

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