我正在JLabel中显示一些文本。基本上,我是动态生成这段文本,并使用一些HTML标签(如
现在我想让我的JLabel在屏幕末端时自动换行,就像记事本中的“自动换行”功能一样。
我该怎么做?
BR
和B
)来格式化文本。最后,我将这个格式化的文本分配给我的JLabel。现在我想让我的JLabel在屏幕末端时自动换行,就像记事本中的“自动换行”功能一样。
我该怎么做?
BR
和B
)来格式化文本。最后,我将这个格式化的文本分配给我的JLabel。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);
}
}
label.setText(label.getText() + "<li>新列表项");
- Andrew Thompson如果您将文本包装在<html>...</html>
中,应该可以正常工作。
更新: 您还应该设置最大大小。
JTextArea
代替JLabel
,并将setWrapStyleWord
和setLineWrap
设置为true,并进行其他设置使其外观和行为像JLabel
(去掉边框,使其非不透明,使其不能编辑和获取焦点)。JLabel
,则必须使用FontMetrics来测量文本的大小,检查空格,并在适当位置添加HTML硬断点。<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);
}
});
}
}
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的字体大小也可以。
混合使用纯文本和HTML将关闭HTML中的自动换行功能:
jLabel_01.setText("<html>Lorem ipsum long paragraph</html>"); // work good
...
jLabel_01.setText(""); // will switch off HTML words wrap!!!
...
jLabel_01.setText("<html>Lorem ipsum long paragraph</html>"); // will not work properly
因此,您不能在一个JLabel中混合不同类型(HTML和纯文本)的文本
我想为那些在互联网上搜索的人发布这篇文章,因为这是一个小错误,让我浪费了30分钟。请确保你已经将文本包装在HTML中。你可能认为你已经这样做了,但实际上并没有。检查一下,我忘记了,当我将它们包装在HTML中时,问题就解决了。
JLabel label = new JLabel("Lorem ipsum long paragraph");
错误的。
JLabel label = new JLabel("<html>Lorem ipsum long paragraph</html>");
正确的!