Java Swing的回流标签小部件
是否有一个Swing小部件,其行为类似于Java Swing的回流标签小部件,java,swing,formatting,label,widget,Java,Swing,Formatting,Label,Widget,是否有一个Swing小部件,其行为类似于JLabel,如果文本的维度发生变化,它会自动刷新文本?例如: Large horizontal space available: +--------------+ | Foo bar baz | +--------------+ Small horizontal space available: +---------+ | Foo bar | | baz | +---------+ 可用的大水平空间: +--------------+ |福吧
JLabel
,如果文本的维度发生变化,它会自动刷新文本?例如:
Large horizontal space available:
+--------------+
| Foo bar baz |
+--------------+
Small horizontal space available:
+---------+
| Foo bar |
| baz |
+---------+
可用的大水平空间:
+--------------+
|福吧巴兹酒店|
+--------------+
可用的小水平空间:
+---------+
|富吧|
|巴兹|
+---------+
我目前正在将
JEditorPane
与setContentType(“text/html”)
和html内容一起使用。这是可行的,但它不使用系统的默认标签字体来显示文本。此外,我不希望将HTML标记放入文本中-充其量,\n
字符将转换为换行符,其他所有内容将显示为文本。我不确定这一点,但我认为值得一试:
可以使用HTML设置JLabel的文本。这将解决字体问题。简单地做一些像
lbl.setText("<html><body>Foo bar baz</body></html>");
lbl.setText(“Foo-bar-baz”);
然后查看文本的行为
如果这对您有效,您可以覆盖JLabel的
setText()
方法,将\n
转换为
,并将html
和body
标记环绕文本。您可以使用多行纯文本小部件JTextArea
JavaDoc:
启用换行设置换行(true)
将换行从基于字符改为基于单词setWrapStyleWord(true)
使其像普通标签一样不透明setOpaque(true)
隐藏插入符号并禁止用户更改文本setEditable(false)
禁用用户选择文本setFocusable(false)
它看起来像一个nornal JLabel,但是只要宽度太小,它就会包装文本。我为
JLabel
创建了一个自定义UI委托,以支持多行。它将包装您的文本,以适应可用的空间,也尊重硬线中断。当组件大小更改时,包装文本应回流。UI委托将侦听组件尺寸的更改,并自动重新计算换行符
使用UI委托非常简单:
JLabel label = new JLabel("Text that'll wrap if necessary");
label.setUI(MultiLineLabelUI.labelUI);
或者,也可以使用自定义的多行标签
类,该类除了包装文本外,还支持垂直和水平文本对齐
以下是项目:
如果您编译并尝试该演示,它应该可以在OS X上进行回流。如果我没记错的话,在Windows上调整框架大小时,回流会出现一些问题。当时没有查看它,但似乎调整大小的事件从未传播到标签。至少在我的情况下(Java 1.5或Java 1.6),换行符的行为与预期不符:它在字符级别而不是word lebel级别包装文本。因此,在上面的示例中,这也可能产生类似“foo-bar b(newline)az”的内容@nd:您需要调用“setWrapStyleWord(true)”才能获得单词级换行。哦,完全忽略了文档中的wrapStyleWord属性。谢谢。如果您的边框不是完全不透明的(例如圆形边框),则需要覆盖paintComponent(),以防止在插图区域中绘制背景。如果您使用MIGLayout,并且对JTextArea为什么会增长而不收缩感到困惑,请在约束中添加“wmin 10”。请参阅以了解更多详细信息。非常好,这比我希望的要好(w/shadows)。我可以确认Windows上存在问题,在我的情况下,我必须调用
MLL.revalidate();MLL.repaint()代码>以便在不调整窗口大小的情况下实际换行长文本。问题似乎是MLL必须在一个可见的容器中才能工作。不需要标签。只要吃就够了
JLabel label = new JLabel("Text that'll wrap if necessary");
label.setUI(MultiLineLabelUI.labelUI);