哪个API使用Java返回正确的字体宽度?

| Java的哪个Font API返回正确的宽度?我们目前使用
font.getStringBounds( \"the string\", frc ).getWidth();
这将在图像和显示上返回正确的值。但是在使用Java SE 6进行打印时是错误的。对于Java 7,一切都正确。差别很小。但是我们在行尾丢失了一个“ i”。我们在印刷时收到完全相同的值。但是文本在打印图形上需要更多空间。 我们使用反别名和分数指标。 我知道有不同的API。但是推荐的API是什么?     
已邀请:
        打印机有图形对象吗?如果您测试此代码,在那种情况下会发生什么?这是我用来测量宽度的内容:
/*
Graphics2D g
Font currentFont
String stringToMeasure
*/
FontMetrics currentFontMetrics = g.getFontMetrics(currentFont);
Rectangle2D stringBounds = currentFontMetrics.getStringBounds(stringToMeasure, g);
double width = stringBounds.getWidth();
    
        
TextLayout
可能是最通用的方法。在下面的问题和答案中可以找到一些相关的示例: Java2D图形抗锯齿。 如何计算文本在JTextArea中的行数(以及每行中的列)? 用省略号截断字符串的理想方法。     
        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());
}

}
    

要回复问题请先登录注册