是否有一个Swing的小部件,其行为类似于JLabel
,如果文本的尺寸发生变化,它会自动重排文本?例如:
Large horizontal space available: +--------------+ | Foo bar baz | +--------------+ Small horizontal space available: +---------+ | Foo bar | | baz | +---------+
我目前正在使用JEditorPane
setContentType("text/html")
和HTML内容。这有效,但它不使用系统的默认标签字体来显示文本。此外,我宁愿不将HTML标记放入我的文本中 - 最好将\n
字符转换为换行符,其他所有字符都将显示为文本。
答案 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/>
,并在文本周围包裹html
和body
标记。
答案 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上调整帧大小时会出现一些问题。当时没有看到它,但似乎调整大小的事件从未传播到标签。