JLabel有“自动换行”属性吗?

问题描述 投票:44回答:6

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

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

我怎样才能做到这一点?

java swing jlabel
6个回答
27
投票

如果你在<html>...</html>中包装文本应该工作

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


90
投票

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

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


11
投票

一种方法是使用JTextArea而不是JLabelsetWrapStyleWordsetLineWrap设置为true和设置使其外观和行为像JLabel(删除边框,使其不透明,使其不可编辑和非可聚焦)。

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


7
投票

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

        });
    }

}

-1
投票

我以为我应该为搜索互联网的人发布这个,因为这是一个小小的错误,花了我30分钟,但确保你实际上用HTML包装文本。你可能认为你做过但却没有。检查一下,我忘记了,当我用HTML包装它时,我就把它修好了。

JLabel label = new JLabel("Lorem ipsum long paragraph");错了。

JLabel label = new JLabel("<html>Lorem ipsum long paragraph</html>");正确!


-1
投票

我喜欢上面提到的JTextArea方法,因为它在BorderLayout面板中很好地在SOUTH调整大小(只要CENTER组件可以在JTextArea中的行数改变时占用松弛)。

然而,在Nimbus L&F中,设置JTextArea的背景颜色有一个问题。似乎Nimbus使用在JTextArea中透明的魔术颜色(扩展类java.awt.Color)。因此,如果要将背景颜色从JPanel复制到JText区域,则需要将Color转换为ARGB并返回Color。以下代码适用于我的JRE(Nimbus,CDE Motif,Metal,Mac OS X)中的所有L&F:

    JTextArea ta = new JTextArea(text);
    ta.setEditable(false);
    ta.setLineWrap(true);
    ta.setWrapStyleWord(true);
    JLabel lb = new JLabel();
    Font f = lb.getFont();
    ta.setFont(f.deriveFont(f.getSize2D() * 0.9f));
    ta.setBorder(lb.getBorder());
    ta.setBackground(new Color(lb.getBackground().getRGB(), true));
    ta.setForeground(new Color(lb.getForeground().getRGB(), true));
    ta.setOpaque(lb.isOpaque());

我把字体缩小了一点。当然,如果需要,您可以保留JLabel的字体大小。

© www.soinside.com 2019 - 2024. All rights reserved.