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

Posted

技术标签:

【中文标题】通过设置最大宽度使 JLabel 包装它的文本【英文标题】:make a JLabel wrap it's text by setting a max width 【发布时间】:2011-01-26 02:49:52 【问题描述】:

我有一个 JLabel,上面有很多文字。有没有办法让 JLabel 有一个最大宽度,以便它将文本换行以使其不超过这个宽度?

谢谢

【问题讨论】:

另见***.com/questions/1627048/… 【参考方案1】:

这非常适合我。不完全是文本换行,但它使文本居中。根据此处的答案,我使用了align 属性并设置了center。 More about align tag here

label.setText("<html><p align=\"center\">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p></html>")

screenshot from my project (我还不能发布图片。抱歉。希望对您有所帮助。)

【讨论】:

【参考方案2】:

&lt;html&gt; 包装有效,但并非在所有情况下都有效。如果父容器使用 FlowLayout,那么它将不起作用。因此我将其设置为 BoxLayout。看这段代码sn -p:

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

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

【讨论】:

【参考方案3】:

是的,有两种类似的方式(第一种使用 css style="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);

【讨论】:

使用 html 进行文本换行的整个过程感觉就像是一种 hack,但它是使其工作的最简单方法。在 div 中设置大小正是我需要使 JLabel 以最大宽度包装而没有任何 3rd 方库或过于复杂的 hack。 如果窗口大小发生变化怎么办?文本必须根据新的标签宽度重排,但使用此解决方案,您必须重新设置它。 &lt;/html&gt; btw :)【参考方案4】:

没有。

您可以在标签中使用 HTML,但您必须对中断标签进行硬编码。

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

请注意,此答案至少在 Java 7 中已过时。

根据@darren 的回答,您只需用&lt;html&gt;&lt;/html&gt; 标签包装字符串:

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

您不需要对任何中断标记进行硬编码。文本在组件调整大小时换行。

【讨论】:

这并不完全正确。如果使用 HTML,您可以对中断标签进行硬编码,但如果您使用 HTML 并指定最大大小,文本将自动换行。 如果您决定硬编码中断标签,请确保使用 而不是 ,因为 Java 5 不喜欢后者。 我喜欢第二个想法,因为第一个可能会将一个单词分成一半,而我想要的是自动换行 “你可以在标签中使用 HTML,但是你必须硬编码 break 标签。” 这是错误的。 CSS 可以指定一个首选的宽度,然后字符串将自动换行,根据需要分成任意多的行。【参考方案5】:

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

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

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

【讨论】:

这不是文字环绕。【参考方案6】:

除了将文本包装在&lt;html&gt; 标签中,您还必须将标签放入一个容器中,该容器尊重首选高度并将宽度设置为最大。例如,您可以将标签放在BorderLayout 的北边。

这是一个简单但完整的工作程序来说明这一点。您可以以任何您想要的方式调整框架的大小;标签将占据整个宽度,高度将相应调整以包裹文本。请注意,我所做的只是使用&lt;html&gt; 标签并将标签放在BorderLayout 的北边。

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

        );
    


【讨论】:

【参考方案7】:

如果您使用段落标签,您可以使用 HTML 而不用硬编码中断标签。

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

【讨论】:

出于某种原因,这对我不起作用。标题后面的 p-tags,并且文本没有被换行。我确实禁用了水平滚动,所以也许这与它有关。 你不需要 p 标签。【参考方案8】:

SwingX project中的JXLabel支持换行

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

【讨论】:

【参考方案9】:

或者干脆用

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

【讨论】:

使用 JDK 7 就足够了,谢谢! JLabel lblTitle = new JLabel("&lt;html&gt;My very very very long title text&lt;/html&gt;"); 如果你这样做,你应该确保myString中的所有HTML实体首先被转义。如果myString 类似于“Value 【参考方案10】:

有个好技巧here,滚动到文末。

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

【讨论】:

以上是关于通过设置最大宽度使 JLabel 包装它的文本的主要内容,如果未能解决你的问题,请参考以下文章

在使用形状(多边形)设置 JLabel 的 Clip 之前,getClip() 仍然返回 null

使 JLabel 文本与中心垂直对齐

Java:JLabel 中的换行符?

Bootstrap 3:中心块不适用于最大宽度[重复]

Bootstrap 使所有列等于最大 col-auto 宽度

如何使按钮宽度跟随基于文本的最大宽度按钮?