java-JLabel是否有“自动换行”属性?

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

现在,我希望Jlabel在到达屏幕末尾时自动将文本换行到下一行,例如“记事本”中的“自动换行”功能。

我怎样才能做到这一点?

Jame asked 2020-02-29T15:58:42Z
6个解决方案
92 votes

可以使用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);
    }
}

enter image description here enter image description here

Andrew Thompson answered 2020-02-29T16:09:27Z
29 votes

如果将文本换行为<html>...</html>,则应该可以使用

更新:然后,您可能也应该设置最大大小。

MarianP answered 2020-02-29T16:09:01Z
11 votes

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

否则,如果您绝对需要使用JLabel,则将不得不使用FontMetrics来测量文本,检查空格,然后自己在适当的位置添加HTML硬符。

Hovercraft Full Of Eels answered 2020-02-29T16:09:53Z
7 votes

我发现此解决方案是最简单的,并且在调整大小时也可以正常使用。 除了将文本包装在<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);
            }

        });
    }

}
Andrei Vajna II answered 2020-02-29T16:10:19Z
-1 votes

只是想我应该把这个发布给任何在互联网上搜索的人,因为这是个花费30分钟的小错误,但是请确保您实际上已经将文本包装成HTML。 您可能以为自己做到了,但是没有。 检查它,我忘了,当我将它们包装成HTML时,它为我修复了它。

JLabel label = new JLabel("<html>Lorem ipsum long paragraph</html>");错误。

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

Adam K Dean answered 2020-02-29T16:15:42Z
-1 votes

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

但是,在Nimbus L&F中,设置JTextArea的背景色存在一些困难。 似乎Nimbus使用了神奇的颜色(java.awt.Color的扩展类)在JTextArea中变得透明。 因此,如果要将背景颜色从JPanel复制到JText区域,则需要将Color转换为ARGB并重新转换为Color。 以下代码对我的JRE中的所有L&F(Nimbus,CDE Motif,Metal,Mac OS X)都适用:

    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的字体大小。

Adam Gawne-Cain answered 2020-02-29T16:16:12Z
translate from https://stackoverflow.com:/questions/7861724/is-there-a-word-wrap-property-for-jlabel