Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Swing的回流标签小部件_Java_Swing_Formatting_Label_Widget - Fatal编程技术网

Java 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 | +---------+ 可用的大水平空间: +--------------+ |福吧

是否有一个Swing小部件,其行为类似于
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);