2010-05-17 33 views
3

我正試圖在Java Swing應用程序中打印發票。我通過擴展Printable並執行方法public int print(Graphics g, PageFormat pf, int page)來實現。如何在Java2D中剪輯字符串並最終添加...?

我想在字段中繪製字符串,當字符串很長時,我想剪切它並讓它以「...」結尾。我如何測量字符串並將其夾在正確的位置?

我的一些代碼:

Font headline = new Font("Times New Roman", Font.BOLD, 14); 
g2d.setFont(headline); 
FontMetrics metrics = g2d.getFontMetrics(headline); 
g2d.drawString(myString, 0, 20); 

即如何限制myString是最大120像素?

我可以使用metrics.stringWidth(myString),但我沒有得到我必須剪輯字符串的位置。

預期的結果可能是:

A longer string that exc... 
A shorter string. 
Another long string, but OK 

回答

1

您可以通過採取stringWidth由字符的數量,以得到每個字符的平均寬度獲得了良好的估計。然後,您可以通過剪輯距離來查看可以容納多少個字符。將字符串從開頭移到幾乎這個距離(減去兩個或三個),然後將...放在最後。

確認新字符串不會剪輯 - 如果有,請根據需要進行一些調整。畢竟如果你有WWWWWWWWWiiiiiiii,你可能需要調整它。但總而言之,這種方法會非常快。

0

一旦你知道該字符串需要被裁剪,您可以使用二進制搜索,看看你能有多少個字符顯示,包括省略號後綴。

這與您嘗試使用N-1個字符,N-2,N-3等類似,直到您找到符合允許空間的子字符串+「...」。但不是線性迭代,而是使用二分搜索來找到嘗試次數較少的字符數。

-1
String cutString(String originalString, int placeholderWidth, FontMetrics fontMetrics) { 
    int stringWidth = fontMetrics.stringWidth(originalString); 
    String resultString = originalString; 

    while (stringWidth >= placeholderWidth) { 
     resultString = resultString.substring(0, resultString.length() - 4); 
     resultString = resultString.concat("..."); 
     stringWidth = fontMetrics.stringWidth(resultString); 
    } 

    return resultString; 
} 
相關問題