Java:JLabels中的换行符?

我正在尝试使用多行文本制作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.\nMMM FFF MMM FFFO O OOM M MMMM.\nMMM FFF MMM FFFO O OOM M MMMM.\n"); comparisonPanel.add(legend); } 

在setText中使用HTML,例如

 myLabel.setText("with
linebreak");

默认情况下,Swing不会换行文本。 如果在JLabel上指定一个大小,它将只绘制适合的文本部分,然后在末尾添加“…”。

如建议您可以使用HTML来启用换行。 但是,我实际上不久前创建了一个自定义Swing UI委托来实现这一目标甚至更多: MultiLineLabelUI 。

它将包装您的文本以适应可用空间并且还尊重硬线断点。 如果您选择尝试,它就像:

 JLabel label = new JLabel("Text that'll wrap if necessary"); label.setUI(MultiLineLabelUI.labelUI); 

或者使用自定义MultiLineLabel类,除了包装文本外,还支持垂直和水平文本对齐。

UPDATE

我丢失了原始代码示例域名。 它现在可以在github上查看: https : //github.com/sasjo/multiline

如果在html中设置段落宽度,则可以获得自动换行符。

  label.setText("

"+paragraph+"

");

您可以将HTML放在JLabel中并使用linebreak标记来实现此目的。

如何在JTextArea中使用包装function?

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

简单,使用HTML。 Java Swing组件虽然没有为HTML提供“梦幻般的”支持,但您可以将它用于这样简单的目的。

 label.setText("This is first line.
This is second line.");

我没有设法为标签指定最大宽度,但您可以指定具体宽度。 通过测量JLabel的当前宽度,如果JLabels的宽度高于我们的maxWidth,我们只能应用新的固定:

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