Какой API возвращает правильную ширину шрифта в Java? - PullRequest
2 голосов
/ 27 мая 2011

Какой Font API Java возвращает правильную ширину? Мы используем в настоящее время

font.getStringBounds( "the string", frc ).getWidth();

Это возвращает правильные значения на изображениях и дисплее. Но это неправильно при печати с Java SE 6. С Java 7 все правильно. Разница очень маленькая. Но мы потеряли одно «я» в конце строки. Мы получаем на печать точно такие же значения. Но тексту требуется больше места на печатной графике.

Мы используем сглаживание и дробные метрики.

Я знаю, что есть разные API. Но что такое рекомендуемый API?

Ответы [ 3 ]

1 голос
/ 27 мая 2011

Есть ли у вас графический объект для принтера?Что в этом случае произойдет, если вы протестируете этот код?Это то, что я использую для измерения ширины:

/*
Graphics2D g
Font currentFont
String stringToMeasure
*/
FontMetrics currentFontMetrics = g.getFontMetrics(currentFont);
Rectangle2D stringBounds = currentFontMetrics.getStringBounds(stringToMeasure, g);
double width = stringBounds.getWidth();
0 голосов
/ 18 декабря 2012

Java округляет все метрики шрифта по умолчанию, поскольку предполагает, что вы пытаетесь отобразить на экране, что вам нужно, чтобы расширить FontRenderContext и включить FractionalMetricsHint, как показано ниже.Затем используйте это для передачи контекста визуализации шрифта.

import java.awt.RenderingHints;
import java.awt.font.FontRenderContext;
import java.awt.geom.AffineTransform;

public class MyFontRenderContext extends FontRenderContext {

public MyFontRenderContext()
{

}
@Override
public AffineTransform getTransform()
{
    return new AffineTransform();
}

/* (non-Javadoc)
 * @see java.awt.font.FontRenderContext#usesFractionalMetrics()
 */
@Override
public boolean usesFractionalMetrics()
{
    return true;
}

/* (non-Javadoc)
 * @see java.awt.font.FontRenderContext#getFractionalMetricsHint()
 */
@Override
public Object getFractionalMetricsHint()
{
    // TODO Auto-generated method stub
    return RenderingHints.VALUE_FRACTIONALMETRICS_ON;
}

/* (non-Javadoc)
 * @see java.awt.font.FontRenderContext#getAntiAliasingHint()
 */
@Override
public Object getAntiAliasingHint()
{
    return RenderingHints.VALUE_ANTIALIAS_ON;
}

/* (non-Javadoc)
 * @see java.awt.font.FontRenderContext#isAntiAliased()
 */
@Override
public boolean isAntiAliased()
{
    return true;
}

}

import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.image.BufferedImage;

public class FontMetricsReader
{
public static void main(String[] args)
{
    Font f = new Font("Frutiger55Roman", java.awt.Font.PLAIN, 6);
    BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB);
    Graphics g = img.getGraphics();
    FontMetrics metrics = g.getFontMetrics(f);

    String str = "The quick brown fox jumps over the lazy dog";

    System.out.println("Rounded text width = " + metrics.stringWidth(str));

    System.out.println("Accurate text width = " + f.getStringBounds(str, new MyFontRenderContext()).getWidth());
}

}
0 голосов
/ 27 мая 2011
...