2009-08-01 60 views
0

我使用自定義表格單元格渲染器渲染文本,如果要超過當前單元格寬度,我想修剪繪製的文本,切換到「此文本是長......「類型的表示,最後的三個點永遠不會離開邊界框。我現在的算法如下:如何將文本渲染爲一個框並用三個點替換多餘

FontMetrics fm0 = g2.getFontMetrics(); 
int h = fm0.getHeight(); 
int ellw = fm0.stringWidth("\u2026"); 
int titleWidth = fm0.stringWidth(se.title); 
if (titleWidth > getWidth()) { 
    for (int i = se.title.length() - 1; i > 0; i--) { 
     String tstr = se.title.substring(0, i); 
     int tstrw = fm0.stringWidth(tstr); 
     if (tstrw + ellw < getWidth()) { 
      g2.drawString(tstr, 2, h); 
      g2.drawString("\u2026", 2 + tstrw, h); 
      break; 
     } 
    } 
} else { 
    g2.drawString(se.title, 2, h); 
} 

有沒有確定一個更好的方式有多少個字符我應該drawString()切換到...(U2026)字符前?

回答

0

這是表的默認渲染器的默認行爲,所以我不確定我是否理解這樣做的原因。

但是我在左邊創建了一個點的渲染器(「... text is too long」),它顯示了一個更完整的方式來執行你想要的操作,因爲它考慮了渲染器上可能的Border,渲染器的單元格間距。檢查出LeftDotRenderer

+0

謝謝。原因是第一行(一個標題)以16pt文本繪製,第二行和第三行(一些細節)在單元格內繪製爲普通文本。 LeftDotRenderer的不同之處主要在於它計算每個字符的大小而不是整個字符串寬度。我會測試它。 – akarnokd 2009-08-01 14:55:50

0

我不能想到另一種方式來達到預期的效果,但你應該能夠用一個替換2 drawString()調用。自從我編寫Java以來​​已經有一段時間了,但我認爲以下內容應該可以工作。

順便說一句,我改變了變量名,所以我可以讀取代碼。 :p

FontMetrics metrics = g2.getFontMetrics(); 
int fontHeight = metrics.getHeight(); 
int titleWidth = metrics.stringWidth(se.title); 

if (titleWidth > getWidth()) { 
    String titleString; 

    for (int i = se.title.length() - 1; i > 0; i --) { 
     titleString = se.title.substring(0, i) + "\u2026"; 
     titleWidth = metrics.stringWidth(titleString); 

     if (titleWidth < getWidth()) { 
      g2.drawString(titleString, 2, fontHeight); 

      break; 
     } 
    } 
} else { 
    g2.drawString(se.title, 2, fontHeight); 
} 
相關問題