我正在尝试使用多行文本制作一个Swing JLabel。 添加起来很好,但是换行符没有通过。 我该怎么做呢? 或者,我可以只为JLabel指定最大宽度并知道文本会像div一样自动换行吗?
private void addLegend() {
JPanel comparisonPanel = getComparisonPanel();
//this all displays on one line
JLabel legend = new JLabel("MMM FFF MMM FFFO O OOM M MMMM.
MMM FFF MMM FFFO O OOM M MMMM.
MMM FFF MMM FFFO O OOM M MMMM.
");
comparisonPanel.add(legend);
}
在setText中使用HTML,例如
myLabel.setText("
withlinebreak");或者,如果您希望更动态地使用它,则可以在html中使用width css或width属性,请参见此处
如果您在html中设置段落宽度,则可以自动换行。
label.setText("
"+paragraph+"
默认情况下,Swing不换行。如果在JLabel上指定大小,它将仅绘制适合文本的部分,然后在末尾添加" ..."。
如建议的那样,您可以使用HTML启用换行。但是,我不久前实际上已经创建了一个自定义的Swing UI委托以实现此目的,甚至更多:MultiLineLabelUI。
它将包装您的文本以适合可用空间,并遵守硬换行符。如果您选择尝试一下,它很简单:
JLabel label = new JLabel("Text that'll wrap if necessary");
label.setUI(MultiLineLabelUI.labelUI);
或者,使用自定义MultiLineLabel类,该类除了包装文本外还支持垂直和水平文本对齐。
更新
我失去了原始代码示例的域。现在可以在github上查看它:https://github.com/sasjo/multiline
@Pacerier:不,不能这样做,因为我需要在包装的文本上绘制效果。 我猜您可以说它以与JTextArea类似的方式破坏文本。
@SamuelSjberg断开的链接MultiLineLabelUI
@oliholz链接现在已更新。 抱歉,花了这么长时间。
您可以将HTML放在JLabel内,并使用linebreak标记来实现。
在JTextArea中使用包装功能怎么样?
String text ="some really long string that might need to"+
"be wrapped if the window is not wide enough";
JTextArea multi = new JTextArea(text);
multi.setWrapStyleWord(true);
multi.setLineWrap(true);
multi.setEditable(false);
JLabel single = new JLabel(text);
JPanel textpanel = new JPanel(new GridLayout(2,1));
textpanel.add(multi);
textpanel.add(single);
JFrame frame = new JFrame();
frame.add(textpanel);
frame.pack();
frame.setVisible(true);
不错的主意,但是只有一个缺点:不可能使用格式化文本。
multi.setBackground(yourframe.getBackground());这将使JTextArea看起来像JLabel。
简单,使用HTML。 Java Swing组件虽然不提供对HTML的"出色"支持,但您可以将其用于如此简单的目的。
label.setText("This is first line.
This is second line.");
我没有为标签指定最大宽度,但可以指定具体宽度。
通过测量JLabel的当前宽度,我们只能在JLabel的宽度大于我们的maxWidth时应用新的fixed:
JLabel label = new JLabel("" + myVeryLongMessage +"");
int maxWidth = 400;
Dimension size = label.getPreferredSize();
if (size.width > maxWidth) {
// Estimate the number of lines
int lineCount = (int) Math.ceil(((double) size.width) / maxWidth);
lineCount += 1; // Add one extra line as reserve
size.width = maxWidth; // Apply the maximum width
// Increase the height so that all lines will be visible
size.height *= lineCount;
label.setPreferredSize(size);
}