JLabel有"自动换行"属性吗?

Jam*_*ame 47 java swing jlabel

我在JLabel中显示一些文本.基本上我是动态生成该文本,然后我应用一些HTML标签(例如,BRB)来格式化文本.最后,我将此格式化文本分配给我的JLabel.

现在我希望我的Jlabel在到达屏幕末尾时自动将文本换行到下一行,就像Note Pad中的"Word Wrap"功能一样.

我怎样才能做到这一点?

And*_*son 92

可以为body使用HTML样式(CSS)设置宽度.这反过来将决定要渲染的行数,从而确定标签的首选高度.

在CSS中设置宽度可以避免计算标签中出现换行符(或最佳大小)的位置.

import javax.swing.*;

public class FixedWidthLabel {

    public static void main(String[] srgs) {
        final String s = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eu nulla urna. Donec sit amet risus nisl, a porta enim. Quisque luctus, ligula eu scelerisque gravida, tellus quam vestibulum urna, ut aliquet sapien purus sed erat. Pellentesque consequat vehicula magna, eu aliquam magna interdum porttitor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed sollicitudin sapien non leo tempus lobortis. Morbi semper auctor ipsum, a semper quam elementum a. Aliquam eget sem metus.";
        final String html = "<html><body style='width: %1spx'>%1s";

        Runnable r = () -> {
            JOptionPane.showMessageDialog(
                    null, String.format(html, 200, s));
            JOptionPane.showMessageDialog(
                    null, String.format(html, 300, s));
        };
        SwingUtilities.invokeLater(r);
    }
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述 在此输入图像描述

  • +1如果你需要一个可变宽度标签你可以使用"100%"而不是"200px"(假设你的GUI使用适当的布局管理器). (10认同)
  • @SteveCohen如果这是浏览器的HTML,是的.这只是Swing组件的HTML,我们可以制作许多快捷方式.这样做的一个优点是它允许我们(轻松地)动态地向HTML添加新内容.EG`label.setText(label.getText()+"<li> New list bullet");` (3认同)
  • 请记住,某些字符需要转义或转换为HTML等效字符. (3认同)

Mar*_*anP 29

如果你把文字包起来应该工作 <html>...</html>

更新: 您也应该设置最大尺寸.

  • @Jame:仅供参考,Netbeans与您的问题无关 - 它只是IDE.Java是你问题的主题...... (3认同)

Hov*_*els 11

一种方法是使用a JTextArea而不是JLabelwith setWrapStyleWordsetLineWrap设置为true并使用设置使其外观和行为类似于JLabel(删除边框,使其不透明,使其不可编辑且不可聚焦).

否则,如果你绝对需要使用a JLabel,你将被迫使用FontMetrics来测量你的文本,检查空格,然后自己在适当的位置添加HTML断点.

  • 我显然不是网络开发人员.感谢您的提醒,以及所有不安分的死网开发人员 - 抱歉和RIP. (6认同)
  • *"添加HTML硬打破"*Web开发人员正在他们的坟墓中翻身.使用样式. (2认同)

And*_* II 8

我发现这个解决方案是最简单的,也适用于调整大小.除了将文本包装在<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)