2011-08-15 19 views
5

Potrzebuję znaleźć szerokość tekstu, który jest narysowany na ekranie. This thread sugeruje, że funkcja FontMetrics.stringWidth() czasami nie będzie tak dokładna, jak FontMetrics.getStringBounds().Jaka jest różnica między FontMetrics.stringWidth() i FontMetrics.getStringBounds()?

Czy ktoś wie, czy jest to poprawne, a jeśli tak, to w jakim kontekście ta różnica jest widoczna? FontMetrics.stringWidth() wydaje się być częściej używany, w tym w SwingUtilities.computeStringWidth(). Oczywistą zaletą jest to, że nie wymaga obiektu Graphics, ale to samo w połączeniu z faktem, że ustawienia wygładzania i podobne ustawienia są zdefiniowane w obiekcie Graphics mogą wyjaśnić, dlaczego funkcja FontMetrics.getStringBounds() może być bardziej dokładna.

+2

Zobacz także [Q & A] (http://stackoverflow.com/questions/5979795/how-to-calculate-the-number-rows-and-columns-in-each-row-a- text-takes-in-aj/5998117 # 5998117). – trashgod

Odpowiedz

5

getStringBounds ma więcej informacji do pracy, ponieważ dostaje podjęło Graphics. Może to wykorzystać do obliczenia umieszczenia glifu subpikselowego i do uwzględnienia efektów wygładzania na rozmiarach glifów. Z dokumentacji FontRenderContext:

antyaliasingu i cząstkowej wskaźniki określone przez aplikację mogą również wpływać na wielkość znaku z powodu zaokrąglenia do granic pikseli.

4

Myślę, że odpowiedź jest w twoim pytaniu. Z Javadocs:

stringWidth

Należy zauważyć, że całkowita szerokość zaliczki zwracane z tej metody nie bierze pod uwagę kontekst renderowania. Dlatego wskazówki dotyczące wygładzania i ułamkowych pomiarów mogą wpływać na wartość zaliczki. Włączając wskazówki dotyczące wygładzania i ułamkowe metryki, użyj metody getStringBounds (String, Graphics) zamiast tej metody. Przesunięcie ciągu znaków niekoniecznie jest sumą zaliczek jego znaków.

Powiązane problemy