2009-12-17 102 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