Java:JLabel 中的换行符?
Posted
技术标签:
【中文标题】Java:JLabel 中的换行符?【英文标题】:Java: Linebreaks in JLabels? 【发布时间】:2010-12-22 23:15:45 【问题描述】:我正在尝试使用多行文本制作 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);
【问题讨论】:
【参考方案1】:您可以使用 JTextArea 并禁用 TextArea,这样您只会显示您想要的内容,而用户将无法输入
JTextArea area = new JTextArea("Here \n\n you \n\n put \n\n your \n\n text");
area.setBounds(10, 11, 500, 143);
area.setEditable(false);
yourPannel.add(area);
【讨论】:
【参考方案2】:我没有为标签指定最大宽度,但您可以指定具体宽度。 通过测量 JLabel 的当前宽度,我们只能在 JLabel 的宽度高于我们的 maxWidth 时应用新的固定宽度:
JLabel label = new JLabel("<html>" + myVeryLongMessage + "<html>");
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);
【讨论】:
【参考方案3】:默认情况下,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 类似的方式破坏文本。 @SamuelSjöberg 链接断开MultiLineLabelUI
@oliholz 链接现已更新。抱歉,拖了这么久。
你好,试了你的课,发现这个课忽略了两个以上的空格……有解决办法吗?【参考方案4】:
简单,使用 HTML。 Java Swing 组件虽然不提供对 HTML 的“出色”支持,但您可以将其用于如此简单的目的。
label.setText("<html>This is first line.<br/>This is second line.</html>");
【讨论】:
【参考方案5】:在html中设置段落宽度可以自动换行。
label.setText("<html><p style=\"width:100px\">"+paragraph+"</p></html>");
【讨论】:
【参考方案6】:在 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。【参考方案7】:
您可以将 HTML 放在 JLabel 中并使用换行标记来实现。
【讨论】:
【参考方案8】:在 setText 中使用 HTML,例如
myLabel.setText("<html><body>with<br>linebreak</body></html>");
【讨论】:
或者如果你想要更动态,那么你可以使用html里面的width css或者width属性,见HERE 可能值得注意: 标签是必需的。没有它们,像 这样的其他标签就不起作用。 标签不是必需的,如果你只是保持简单的话。以上是关于Java:JLabel 中的换行符?的主要内容,如果未能解决你的问题,请参考以下文章