有没有JLabel的“自动换行”属性?

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

现在我想让我的Jlabel自动将文本换到下一行,当它到达屏幕的末尾,就像记事本中的“Word Wrap”function一样。

我怎样才能做到这一点?

如果将文本包装在<html>...</html>应该可以工作

更新:那么你应该也可以设置最大尺寸。

可以使用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 html1 = "<html><body style='width: "; final String html2 = "px'>"; Runnable r = new Runnable() { @Override public void run() { JOptionPane.showMessageDialog( null, new JLabel(html1 + "200" + html2 + s)); JOptionPane.showMessageDialog( null, new JLabel(html1 + "300" + html2 + s)); } }; SwingUtilities.invokeLater(r); } } 

在这里输入图像描述在这里输入图像描述

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

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

我发现这个解决scheme是最简单的,并且可以正确resize。 除了在<html>标签中包装文本之外,还必须将标签放入容器中,该容器尊重首选高度并将宽度设置为最大值。 例如,您可以将标签放在BorderLayout

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

只是以为我应该发布这个任何人在网上search,因为这是一个小小的错误,花了我30分钟,但确保你已经实际上包装在HTML文本。 你可能以为你做过,但没有。 检查它,我忘记了,当我用HTML包装它时,它为我修好了。

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

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

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

但是,在Nimbus L&F中,有一个设置JTextArea背景颜色的方法。 看来,Nimbus使用在JTextArea中变为透明的魔法颜色(扩展的java.awt.Color类)。 所以,如果您将背景颜色从JPanel复制到JText区域,则需要将“颜色”转换为“ARGB”并返回“颜色”。 以下代码适用于我的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的字体大小。