2011-08-15 15 views
5

我需要找到在屏幕上繪製的文本的寬度。 This thread表明FontMetrics.stringWidth()有時不會像FontMetrics.getStringBounds()那樣精確。FontMetrics.stringWidth()和FontMetrics.getStringBounds()有什麼區別?

有誰知道這是否正確,如果是,在哪種情況下這種差異是可見的? FontMetrics.stringWidth()似乎更頻繁地使用,包括在SwingUtilities.computeStringWidth()中。另外,顯而易見的優勢是它不需要Graphics對象,但這本身結合在Graphics對象中定義的抗鋸齒和類似設置的事實可能解釋了爲什麼FontMetrics.getStringBounds()可能更準確。

+2

另請參閱此問題[問與答](http://stackoverflow.com/questions/5979795/how-to-calculate-the-number-of-rows-and-columns-in-each-rowa-a-文本通吃的-AJ/5998117#5998117)。 – trashgod

回答

5

getStringBounds有更多信息的工作,因爲它被傳遞一個圖形。它可以用它來計算子像素字形的位置並考慮字形大小的抗鋸齒效果。從FontRenderContext的文檔:由應用程序指定的

抗混疊和分數的指標也能影響,因爲舍入到像素邊界的字符的大小。

4

我認爲答案在你的問題。從的javadoc:

stringWidth

注意,此方法返回的總advance width沒有考慮到渲染上下文。因此,抗鋸齒和分數度量提示可能會影響進度的價值。啓用抗鋸齒和分數度量提示時,請使用getStringBounds(String,Graphics)而不是此方法。字符串的前進不一定是字符前進的總和。