[英]JLabel wrapping plain text as JTextArea
我对JLabel
和纯文本包装有问题。 对于纯文本换行,我使用的是LabelView
,但我对它给我的结果不是很满意。
我的目标是获得纯文本换行,例如JTextArea
。 我试过WrappedPlainView
但它只适用于JTextComponent
所以我的问题是你们可能知道/或有一些预先的JLabel
视图?
注意:我不想将 html 添加到我的纯文本中。
标签视图: http : //docs.oracle.com/javase/6/docs/api/javax/swing/text/LabelView.html
WrappedPlainView: http ://docs.oracle.com/javase/6/docs/api/javax/swing/text/WrappedPlainView.html
试试这个例子,看看在调整框架大小时单词是如何包装的:
import javax.swing.*;
import java.awt.*;
public class Example extends JFrame {
private static final String LONG_TEXT = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. " +
"Ut in enim velit. Nunc posuere purus ac odio dictum auctor. " +
"Vivamus nec sem mi. Curabitur sed iaculis nibh. Proin vel massa augue. " +
"Aenean laoreet, tellus ut vulputate mollis, justo eros ornare tortor, " +
"vitae venenatis turpis augue id purus. In quis pretium justo. " +
"Quisque interdum sem at augue ultrices molestie. " +
"Nulla consectetur magna nec est malesuada sed ultricies diam gravida. " +
"Curabitur luctus, nulla nec pulvinar fringilla, enim turpis luctus tellus, " +
"non auctor diam ligula quis lectus.";
public Example()
{
JTextArea textArea = new JTextArea(LONG_TEXT);
textArea.setWrapStyleWord(true);
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);
textArea.setOpaque(false);
textArea.setEditable(false);
add(new JScrollPane(textArea), BorderLayout.CENTER);
setMinimumSize(new Dimension(100, 100));
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setVisible(true);
}
public static void main(String []args)
{
new Example();
}
}
看看这个例子,你会看到 JLabel 包装词的问题:
import javax.swing.*;
import java.awt.*;
public class Example extends JFrame {
private static final String LONG_TEXT = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. " +
"Ut in enim velit. Nunc posuere purus ac odio dictum auctor. " +
"Vivamus nec sem mi. Curabitur sed iaculis nibh. Proin vel massa augue. " +
"Aenean laoreet, tellus ut vulputate mollis, justo eros ornare tortor, " +
"vitae venenatis turpis augue id purus. In quis pretium justo. " +
"Quisque interdum sem at augue ultrices molestie. " +
"Nulla consectetur magna nec est malesuada sed ultricies diam gravida. " +
"Curabitur luctus, nulla nec pulvinar fringilla, enim turpis luctus tellus, " +
"non auctor diam ligula quis lectus.";
public Example()
{
JLabel label = new JLabel(LONG_TEXT);
add(label, BorderLayout.CENTER);
setMinimumSize(new Dimension(100, 100));
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setVisible(true);
}
public static void main(String []args)
{
new Example();
}
}
所以目标是让 JLabel 单词像在 JTextArea 中一样换行。
注意:在实际项目中,我正在使用 javax.swing.text.View`s 并且我使用 LabelView 作为纯文本。
所以我的问题是也许你们知道/或有一些预先的 JLabel 观点,
有两种方式,
使用 JTextComponent
.
将 JLabel 与 Html 一起使用(减少并实现了 Html3.2 版本)
邮政和SSCCE
编辑:
注意:在实际项目中,我正在使用 javax.swing.text.View`s 并且我使用 LabelView 作为纯文本。
对于JTextComponents
和javax.swing.text.Xxx
需要使用初始PreferredSize
,请参阅public JTextArea(String text, int rows, int columns)
添加 1) 使用 JTextComponent
必须做出决定
如果包裹在JScrollPane
没有或没有可见的 JScrollBar(覆盖 MouseScroll)
或者简单地添加到容器中,我建议使用 BorderLayout 或 GridLayout,然后 JTextArea 也可以使用容器调整大小(看起来像)
可滚动的 JComponents 将被添加到 JScrollPane
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;
public class ExampleJTextArea extends JFrame {
private /*static*/ final String LONG_TEXT = "Lorem ipsum dolor sit amet, "
+ "consectetur adipiscing elit. Ut in enim velit. Nunc posuere "
+ "purus ac odio dictum auctor. Vivamus nec sem mi. Curabitur sed "
+ "iaculis nibh. Proin vel massa augue. Aenean laoreet, tellus ut "
+ "vulputate mollis, justo eros ornare tortor, vitae venenatis "
+ "turpis augue id purus. In quis pretium justo. Quisque interdum "
+ "sem at augue ultrices molestie. Nulla consectetur magna nec est "
+ "malesuada sed ultricies diam gravida. Curabitur luctus, nulla "
+ "nec pulvinar fringilla, enim turpis luctus tellus, non auctor "
+ "diam ligula quis lectus.";
public ExampleJTextArea() {
JTextArea textArea = new JTextArea(LONG_TEXT, 10, 25);
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);
textArea.setOpaque(false);
textArea.setEditable(false);
textArea.setBorder(new EmptyBorder(10,10,2,2));
add(/*new JScrollPane(*/textArea/*), BorderLayout.CENTER*/);
//setMinimumSize(new Dimension(100, 100));
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
pack();
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
ExampleJTextArea exampleJTextArea = new ExampleJTextArea();
}
});
}
}
.
.
一个非常古老的线程,但万一有人再次遇到这个问题......
这些解决方案似乎都不适合我(也许是因为包含我的 JLabel 的 JPanel 被 JScrollPane 查看了?),而且我无法让 JTextAreas 工作,因为它有一些繁琐的错误,它在增长但不会“ t 收缩。
相反,这是我能找到的最简单的 JLabel 包装文本解决方案,由 Tony Fecteau 在此页面上提供:只需在 html 格式的 JLabel 上使用setPreferredSize()
,它就会开始自动增长和缩小!
panel = new JPanel();
JLabel label = new JLabel("<html>" + "long text to display" + "</html>");
label.setPreferredSize(new Dimension(1, 1)); // this is the key part.
panel.add(label, "grow");
我也同意@mKorbel 的观点,即有两种方法可以通过JLabel
实现正确的换行:
a) 创建您自己的自定义组件,在包装时模拟JLabel
样式。
public class CustomWrappedLabel extends JTextArea {
public CustomWrappedLabel(String text) {
super(text);
setBackground(null);
setEditable(false);
setBorder(null);
setLineWrap(true);
setWrapStyleWord(true);
setFocusable(false);
}
}
用法:
new CustomWrappedLabel("Hey you've just tried multi-line text!");
确保将行数设置为超过 2 行以实现所需的行为。 wrappedLabelObj.setRows(2)
。 使用pack()
正确计算父组件的高度。
b) 使用 html 自动处理<html>
标签内的包装文本。
new JLabel("<html>Hey you've just tried html multi-line text version!</html>")
您可以使用<br />
换行。
希望这可以帮助!
试试这个
jLabel.setText(String.format("<html><body style=\"text-align: justify; text-justify: inter-word;\">%s</body></html>",LONGTEXT));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.