Measuring Text

要正确测量文本,您需要学习一些方法和一些避免的错误。字体度量是对Font对象渲染的文本的度量,例如字体中一行文本的高度。测量文本的最常见方法是使用FontMetrics实例,该实例封装了这些度量标准信息。例如:

// get metrics from the graphics
FontMetrics metrics = graphics.getFontMetrics(font);
// get the height of a line of text in this
// font and render context
int hgt = metrics.getHeight();
// get the advance of my text in this font
// and render context
int adv = metrics.stringWidth(text);
// calculate the size of a box to hold the
// text with some padding.
Dimension size = new Dimension(adv+2, hgt+2);

对于许多应用程序来说,这种方式足以使文本行均匀间隔或调整 Swing 组件的大小。

请注意以下几点:

  • 度量是从Graphics类获得的,因为此类封装了FontRenderContext,这是准确测量文本所必需的。在屏幕分辨率下,会调整字体以便于阅读。随着文本大小的增加,此调整不会线性缩放。因此,在 20 点时,字体显示的文本 Long 度不会是在 10 点时的两倍。除了文本本身和字体外,测量文本所需的另一重要信息是FontRenderContext。此方法包括从用户空间到用于测量文本的设备像素的转换。

  • 报告高度时不参考任何特定的字符串。例如,在文本编辑器中,该功能很有用,您希望在文本编辑器中每行文本之间具有相同的行距。

  • stringWidth()返回文本的前进宽度。 高级宽度是从文本原点到随后呈现的字符串 的位置的距离。

使用这些方法测量文本时,请注意,文本可以在矩形外部的任何方向延伸,该矩形由字体高度和字符串 的行进定义。

该图显示了通过使用字体 Metrics 来热测量文本

通常,最简单的解决方案是确保文本不被例如环绕文本的组件剪切。如果文本可能会被剪切,请添加填充。

如果此解决方案不够充分,则 Java 2D 软件中的其他文本度量 API 可以返回矩形边界框。这些框说明了要测量的特定文本的高度以及像素化效果。