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

Aly*_*Aly 79 java user-interface swing jlabel

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

谢谢

cam*_*ckr 49

没有.

您可以在标签中使用HTML,但是您必须对break标记进行硬编码.

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

注意,这个答案至少从Java 7开始已经过时了.

根据@darren的回答,你只需要用字符串<html></html>标签包装:

myLabel.setText("<html>"+ myString +"</html>");
Run Code Online (Sandbox Code Playgroud)

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

  • 这不完全正确.如果使用HTML,您*可以*破解标记的硬编码,但如果您使用HTML并指定最大大小,文本将自动换行. (14认同)
  • 如果你决定硬编码中断标记,请确保使用<br>而不是<br />,因为Java 5不喜欢后者. (2认同)

Ale*_*erg 46

是的,有两种类似的方式(首先使用css style ="width:... px",第二种使用html WIDTH = ...:

1.

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

2.

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

  • 如果窗口大小改变怎么办?文本必须根据新的标签宽度进行重新打印,但是使用此解决方案,您必须再次设置它. (6认同)
  • 使用html进行文本包装的整个过程感觉就像是一个hack,但它是使它工作的最简单方法.设置div中的大小正是我所需要的,使JLabel包装的最大宽度没有任何第三方库或过于复杂的黑客. (5认同)

小智 35

或者只是使用

myLabel.setText("<html>"+ myString +"</html>");
Run Code Online (Sandbox Code Playgroud)

  • 如果这样做,你应该确保首先转义`myString`中的任何HTML实体.如果`myString`类似于"Value <5",它将显示为"Value 5". (4认同)

小智 12

如果使用段落标记,则可以使用HTML而不使用硬编码中断标记.

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


kle*_*tra 11

SwingX项目中的 JXLabel 支持包装

JXLabel label = new JXLabel(somelongtext);
label.setLineWrap(true);  
Run Code Online (Sandbox Code Playgroud)


Sam*_*num 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);
Run Code Online (Sandbox Code Playgroud)


And*_* II 6

除了将文本包装在<html>标签中之外,还必须将标签放入一个尊重首选高度的容器中,并将宽度设置为最大值.例如,您可以将标签放入a的NORTH BorderLayout.

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

        });
    }

}
Run Code Online (Sandbox Code Playgroud)