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


Answers:


55

没有。

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

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

请注意,至少从Java 7开始,此答案已过时。

按照@darren的回答,您只需要用<html></html>标签包装字符串即可:

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

您无需对任何中断标签进行硬编码。文本随着组件的调整而自动换行。


14
这不是完全正确的。如果使用HTML,则可以对break标签进行硬编码,但是如果使用HTML并指定最大尺寸,则文本将自动换行。
丹尼尔·里科夫斯基

2
如果决定硬编码中断标签,请确保使用<br>而不是<br />,因为Java 5不喜欢后者。
Craigo

我喜欢第二个主意,因为第一个主意可能将一个单词分解为一半,而我想要的是自动换行
shareef 2015年

“您可以在标签中使用HTML,但是必须对break标签进行硬编码。” 错了 CSS可以指定首选的宽度,然后字符串将自动在单词上自动换行,并根据需要换成多行。
Andrew Thompson

45

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

5
使用html进行自动换行的整个过程看起来像是一种破解,但这是使其工作最简单的方法。在div中设置大小恰好是我制作最大宽度的JLabel包装所需要的,而没有任何第三方库或过于复杂的黑客。
彼得·多尔伯格

6
如果窗口大小改变怎么办?必须根据新的标签宽度重排文本,但是使用此解决方案,您将不得不再次设置它。
Andrii Chernenko

1
</html>BTW :)
吉日

35

或简单地使用

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

使用JDK 7就足够了,谢谢! JLabel lblTitle = new JLabel("<html>My very very very long title text</html>");
Matthieu

4
如果这样做,则应确保其中的所有HTML实体myString都先被转义。如果myString是“ Value <5”之类的东西,它将显示为“ Value 5”。
Rangi Keen

12

如果使用段落标签,则可以使用不带硬编码中断标签的HTML。

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

由于某种原因,这对我不起作用。标题后面有p标签,并且不包装文字。我确实禁用了水平滚动,所以可能与它有关。
Bram Vanroy

您不需要p标签。
埃里克·罗伯逊


7

有一个很好的技术在这里,滚动到文章的末尾。

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

7

除了将文本包装在<html>标签中之外,还必须将标签放入符合首选高度并将宽度设置为最大的容器中。例如,您可以将标签放在的北侧BorderLayout

这是一个简单但完整的工作程序来说明这一点。您可以根据需要调整框架的大小。标签将占据整个宽度,高度将相应调整以包裹文本。请注意,我要做的就是使用<html>标签并将标签放在的北部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);
            }

        });
    }

}

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,可以尝试这种方法,

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

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

这不是文字换行。
SapuS07年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.