2011-11-01 84 views
14

在Java中時的JLabel的文本無法顯示,由於缺乏空間的文本被截斷,「......」在最後。發現如果一個JLabel的文本超出標籤尺寸

如何輕鬆找出當前JLabel是顯示全文還是截斷?


編輯:

我看到有使用FontMetrics找出文本大小的方法。然而這個解決方案並沒有完全回答這個問題。在JLabel文本包含HTML裝飾的情況下,metrics.stringWidth()也會計算HTML標籤的寬度。因此,metrics.stringWidth()的結果可能會比JLabel的寬度更粗糙,但文本仍然會正確顯示。

有沒有辦法知道在顯示文本時JLabel本身做了什麼決定。它是否決定截斷文本?

回答

8

省略號由標籤的UI委託加入,典型地a的BasicLabelUI亞類中,作爲其一部分的佈局和優選的尺寸計算。可以覆蓋方法layoutCL()來檢查幾何圖形,如example所示。

作爲一個實際問題,我會忽略elision並在工具提示中顯示全文。

+2

'在工具提示中顯示全文。「這幾乎是我想要做的。如果文本被截斷以在工具提示中顯示全文。 – jutky

+1

非常感謝。這是一個非常優雅的解決方案。 – jutky

+1

在工具提示上的良好通話,我現在正在使用它。 –

5

從甲骨文 - Measuring Text

// get metrics from the graphics 
FontMetrics metrics = graphics.getFontMetrics(font); 
// get the height of a line of text in this font and render context 
int hgt = metrics.getHeight(); 
// get the advance of my text in this font and render context 
int adv = metrics.stringWidth(text); 
// calculate the size of a box to hold the text with some padding. 
Dimension size = new Dimension(adv+2, hgt+2); 

比較sizeJLabel.getSize()的大小;

+0

如果我想確保所有的文本將顯示標籤(無中繼線)?我怎麼能保證,沒有顯式設置JXabel的大小setXXXSize? – Heisenbug

+0

聽起來對我來說不可能。平凡地說,如果你有一個10像素寬的標籤,文本是莎士比亞的完整作品,除非你改變JLabel的大小,否則會有一些截斷。 – Kane

+0

@Heisenburg:你計算Oracle描述的文本大小,然後使用setPreferredSize方法設置JLabel。你必須找出JLabel的第四行中適當的填充常量。 –

1

通常的方式做到這一點是使用計算,因爲它會在標籤中顯示的文本的預期大小的方法。如果您使用的是等寬字體,這很容易:

lengthOfChar * numChars 

如果您不使用等寬字體,顯然要困難得多。我想有一些公用事業公司會試圖計算這一點。

一旦你的顯示字符串的大小,你可以比較的JLabel的長度,看看標籤太小。

4

我想,如果組件的首選尺寸大於它的實際尺寸,那麼你可以指望截斷。爲了這個工作,當然,該組件必須已經實現了。

+1

我不確定。如果我將首選大小設置爲比完全顯示文本所需的大,則可能是實際大小小於首選值,但文本仍未被截斷。 – jutky

+0

@jutky,建議不要明確設置首選大小。這是你應該留給佈局經理的東西。 – mre

+0

那麼我應該如何限制組件的大小呢?我教導說這是首選尺寸。 – jutky

3

檢查this,看到了layoutCompoundLabel()方法。它返回一個表示標籤文本的字符串。您可以將其與原始文件進行比較,以確定它是否會被裁剪。

吉姆S.

+0

它看起來不錯,但我從哪裏得到viewR,iconR,textR變量的值? – jutky

+0

我傳遞了label.getBounds()爲所有三個,它似乎工作正常。 –

0

將HTML文本的大小檢查此https://www.java.net/node/665691

View view = (View) javax.swing.plaf.basic.BasicHTML.createHTMLView(label, value.toString()); 
int width = (int) view.getPreferredSpan(View.X_AXIS); 
int height = (int) view.getPreferredSpan(View.Y_AXIS); 

唯一的一個小問題是它可能與非html文本有關。所以,只使用非html字符串的字體指標。以下工作完美適合我:

if (value.toString().startsWith("<html>")) { 
    View view = (View) javax.swing.plaf.basic.BasicHTML.createHTMLView(label, value.toString()); 
    width = (int) view.getPreferredSpan(View.X_AXIS); 
} 
else { 
    width = (int) label.getFontMetrics(label.getFont()).stringWidth(value.toString()); 
}