Java 是否有一个“问题”;“自动换行”;JLabel的属性?

Java 是否有一个“问题”;“自动换行”;JLabel的属性?,java,swing,jlabel,Java,Swing,Jlabel,我正在JLabel中显示一些文本。基本上,我是动态生成文本,然后应用一些HTML标记(例如,BR和B)来格式化文本。最后,我将这个格式化文本分配给我的JLabel 现在,我希望我的Jlabel在文本到达屏幕末尾时自动将其换行到下一行,就像记事本中的“换行”功能一样 我该怎么做呢?如果您将文本包装在… 更新: 您可能也应该设置最大大小。一种方法是使用JTextArea而不是JLabel,将setWrapStyleWord和setLineWrap设置为true,并设置为使其外观和行为类似于JLabe

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

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


我该怎么做呢?

如果您将文本包装在

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

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


否则,如果您确实需要使用
JLabel
,您将被迫使用FontMetrics来测量文本,检查空白,然后自己在适当的位置添加HTML硬分隔符。

可以使用HTML样式(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);
    }
}
在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);
    }
}
import javax.swing.*;
公共类固定宽度标签{
公共静态void main(字符串[]srgs){
最终字符串s="知识同我同我坐在一起,奉献给我们的精英们。我们不属于我们。我们坐在一起,是我们的门户。奎斯克·卢克图斯,我们的母亲,我们的前庭,我们的前庭,我们的前庭,我们的前庭,我们的前庭,我们的前庭,我们的前庭,我们的前庭,我们的前庭,我们的前庭,我们的前庭,我们的前庭,我们的前庭,我们的前庭,我们的前庭,我们的前庭,我们的前庭,我们的前庭,我们的前庭,我们的前庭,我们的前庭,我们的前庭,我们的前庭“每一个祖先,每一个接受者,每一个智者,每一个非利奥人,每一个灵魂,每一个灵魂,每一个元素,每一个元素,每一个元素,每一个元素,每一个元素,每一个元素,每一个元素,每一个元素,每一个元素,每一个元素,每一个元素,每一个元素。”;
最终字符串html=“%1s”;
可运行r=()->{
JOptionPane.showMessageDialog(
null,String.format(html,200,s));
JOptionPane.showMessageDialog(
null,String.format(html,300,s));
};
SwingUtilities.invokeLater(r);
}
}

我发现此解决方案最简单,并且可以正确调整大小。除了将文本包装在
标记中,您还必须将标签放入符合首选高度并将宽度设置为最大值的容器中。例如,您可以将标签放在
边框布局的北面

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

        });
    }

}
下面是一个简单但完整的工作程序来说明这一点。您可以按任何方式调整框架的大小;标签将占据整个宽度,高度将相应调整以包裹文本。请注意,我所做的只是使用
标记,并将标签放在
边框布局的北部

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

        });
    }

}
import javax.swing.JFrame;
导入javax.swing.SwingUtilities;
导入javax.swing.JPanel;
导入javax.swing.JLabel;
导入java.awt.BorderLayout;
导入java.awt.Dimension;
公共类标签纸{
公共静态JPanel createPanel(){
JLabel标签=新的JLabel();
label.setText(“”)
+“Lorem ipsum dolor sit amet,献祭精英。”
+“Duis是一只小乌尔纳。Phasellus tristique interdum mauris,”
+“前庭purus suscipit eget.Aenean massa elit,accumsan”
+“非流氓级,在bibendum和est Sagitti中的地方名言”
+“乌尔纳·艾库利斯·奎斯·萨吉蒂·维利特·科莫多自然社会”
+“因怀孕而产下的小牛”
+“南奎斯-拉库斯-莫里斯·菲塞勒斯·塞姆-自由女神,康瓦利斯”
+“马蒂斯·萨吉提斯·维尔,拍卖人埃吉特·伊普苏姆。胎动永远”
+“在一个特殊的地方,一个精英阶层,在一个特殊的地方”
+“orci a tortor consequeat consequeat vitae sit amet elite.present”
+“康莫多·拉克斯是一辆大型汽车。库拉比图尔·亨德雷特”
+“这是一个很好的例子。

” + +“秃鹫,乌鲁斯·胡斯托·劳里特·奥古斯,封建主义的智者” +“这是一种在酒后饮用的酒。” +“Praesent et mauris non tellus孕妇mollis.在hac habitasse” +“虎口浮士鱼同侧前庭前板” +前庭 +“折磨人的权杖是拉奥里特,而不是拉卡斯” +“不,不,不,不,不,不” +“怀孕期间,elit velit malesuada arcu,nec aliquam lectus” +“在尼布·亨德雷利特等地的大教堂里,有一座大教堂” +“生命元素,生命元素,生命元素,生命元素” +“厄洛斯,达皮布斯在埃利芬德坐着阿梅特,布兰迪特·埃吉特·普鲁斯。” +“佩伦茨克欧洲摩利斯或塞德维尼那提斯钻石暂时” +“康格。

” + ""); JPanel panel=newjpanel(newborderlayout()); 面板。添加(标签,边框布局。北); 面板。设置首选尺寸(新尺寸(640480)); 返回面板; } /** *@param args */ 公共静态void main(字符串[]args){ SwingUtilities.invokeLater(新的Runnable(){ @凌驾 public void run(){ JFrame=新JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setContentP