2009-12-17 89 views
2

Swing的小部件的行为如同JLabel,如果文本的尺寸发生变化,会自动重排文本?例如:Swing的标签小部件

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

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

我目前使用JEditorPanesetContentType("text/html")和HTML内容。这可以工作,但它不使用系统的默认标签字体来显示文本。另外,我宁愿不将HTML标签放入我的文本中 - 最好是,\n字符将被转换为换行符,其他所有内容都将显示为文本。

回答

2

我为JLabel做了一个自定义用户界面委托,以支持多行。它会包装您的文字以适应可用空间,并且也尊重强硬的换行符。当组件大小改变时,被包装的文本应该回流。 UI委托侦听组件维度的更改并自动重新计算换行符。

使用UI委托是直线前进的:

JLabel label = new JLabel("Text that'll wrap if necessary"); 
label.setUI(MultiLineLabelUI.labelUI);

或可选择地使用自定义MultiLineLabel类,除了文本换行支持垂直和水平文本对齐方式。

这里的项目:https://github.com/sasjo/multiline

如果您编译并尝试演示,它应该如果我没记错的话有一些问题,在调整Windows上的框架回流回流在OS X罚款。当时没有关注它,但似乎重新调整大小的事件从未传播到标签。

+0

非常好,这比我想要的更好(w /阴影) – 2009-12-17 14:09:57

+0

我可以确认在Windows上有问题,在我的情况下,我不得不调用'MLL.revalidate(); MLL.repaint();'为了让长文本实际包装而不调整窗口大小。问题似乎是MLL在工作之前必须在一个可见的容器中。 – Justin 2010-06-29 17:53:43

4

我不知道这一点,但我认为这是值得一试:

可以使用HTML设置JLabel的文本。这应该照顾字体问题。只需执行如下操作:

lbl.setText("<html><body>Foo bar baz</body></html>"); 

查看文本如何表现。

是否适合你,你可以覆盖JLabel的setText()方法\n转换成<br/>和环绕文本htmlbody标签。

+0

不需要标记。只有就足够了 – 2010-01-01 20:08:07

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)更改自character-缠绕到单词为基础的
  • setOpaque(true)使得它不透明,像一个正常的标签
  • setEditable(false)皮脱字符并禁用用户更改文字
  • setFocusable(false)禁止用户选择文本

它看起来像一个nornal的JLabel,但它会自动换行,只要宽度太小。

+0

至少在我的情况下(Java 1.5或Java 1.6),换行并不像预期的那样:它将文本包装在字符级而不是字lebel。所以在上面的例子中,这也可能产生类似于“foo bar b(newline)az” – 2009-12-17 10:17:59

+1

@nd:您需要调用'setWrapStyleWord(true)'才能获得字级换行。 – uckelman 2009-12-17 11:23:22

+0

@uckleman:谢谢,更正了代码 – 2009-12-17 12:45:46