Java - 不使用Graphics的FontMetrics

37

如何在不使用Graphics的情况下获取FontMetrics?我想在构造函数中获取FontMetrics,现在我是这样做的:

BufferedImage bi = new BufferedImage(5, 5, BufferedImage.TYPE_INT_RGB);
FontMetrics fm = bi.getGraphics().getFontMetrics(font);
int width = fm.stringWidth(pattern);
int height = fm.getHeight();

你为什么想要在没有图形的情况下做这个? - tangens
我创建了自己的控件,并且想在构造函数中设置首选大小。 - piotrek
7
当处于无界面模式时,即通过命令行将字体转换为位图的工具时,此功能可用于获取字体度量信息。 - Sam Washburn
2个回答

42

不一定需要获取/使用图形对象:

Font font = new Font("Helvetica",Font.PLAIN,12);
Canvas c = new Canvas();
FontMetrics fm = c.getFontMetrics(font);

如果您现在调用c.getGraphics(),它将返回null。另一方面,画布方案在无头模式下也可工作。


2
如果我可以稍微扩展一下 - 如果您正在从文件中读取字体,请记得使用可行的大小“派生”字体(忘记这样做将导致getMaxAscent/Descent等值返回1):Font sourceFont = Font.createFont(Font.TRUETYPE_FONT, fontStream); Font awtFont = sourceFont.deriveFont(72.0f); Canvas canvas = new Canvas(); FontMetrics metrics = canvas.getFontMetrics(awtFont); - Nathan Crause

22

嗯...需要图形才能获得FontMetrics是很合乎逻辑的。在不同的显示屏上,字体高度、宽度等可能会有所不同。

如果您有一些组件,可以使用它来获取FontMetrics:

component.getFontMetrics(font);

1
你确定字体的宽度和高度取决于显示器而不是我指定的字体大小吗? - Mohammed Shareef C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接