为Swing重新流动标签小部件

时间:2009-12-17 09:32:02

标签: java swing formatting label widget

是否有一个Swing的小部件,其行为类似于JLabel,如果文本的尺寸发生变化,它会自动重排文本?例如:

Large horizontal space available:
+--------------+
| Foo bar baz  |
+--------------+

Small horizontal space available:
+---------+
| Foo bar |
| baz     |
+---------+

我目前正在使用JEditorPane setContentType("text/html")和HTML内容。这有效,但它不使用系统的默认标签字体来显示文本。此外,我宁愿不将HTML标记放入我的文本中 - 最好将\n字符转换为换行符,其他所有字符都将显示为文本。

3 个答案:

答案 0 :(得分:7)

您可以使用JTextArea,一个多行纯文本小部件。

JavaDoc:http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/JTextArea.html

    JTextArea ta = new JTextArea("A JTextArea containing a long text");
    ta.setLineWrap(true);
    ta.setWrapStyleWord(true);
    ta.setOpaque(false);
    ta.setEditable(false);
    ta.setFocusable(false);
  • setLineWrap(true)启用包装
  • setWrapStyleWord(true)更改了从字符到字的包装
  • setOpaque(true)将其呈现为不透明,就像普通标签
  • 一样
  • setEditable(false)隐藏插入符并禁用用户更改文本
  • setFocusable(false)禁止用户选择文字

它看起来像一个nornal JLabel,但只要宽度太小,它就会包装文本。

答案 1 :(得分:4)

我不确定这一点,但我认为值得一试:

您可以使用HTML设置JLabel的文本。这应该照顾字体问题。只需做一些像

这样的事情
lbl.setText("<html><body>Foo bar baz</body></html>");

了解文本的行为。

如果适合您,您可以覆盖JLabel的setText()方法,将\n转换为<br/>,并在文本周围包裹htmlbody标记。

答案 2 :(得分:2)

我为JLabel制作了一个自定义UI委托,以支持多行。它将包装您的文本以适应可用空间并且还尊重硬线断点。当组件大小更改时,包装的文本应该重排。 UI委托侦听组件维度的更改并自动重新计算换行符。

使用UI委托就像:

一样直截了当
JLabel label = new JLabel("Text that'll wrap if necessary");
label.setUI(MultiLineLabelUI.labelUI);

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

这是项目:https://github.com/sasjo/multiline

如果您编译并尝试演示,它应该在OS X上重新编译。如果我没记错,在Windows上调整帧大小时会出现一些问题。当时没有看到它,但似乎调整大小的事件从未传播到标签。