我正在寻找一种从宽度推断 Java AWT 字体大小的方法。例如,我知道我想在 100 像素内写出“hello world”。我知道我在 style 中使用字体“Times”,Font.PLAIN并且我想获得最适合我给定的 100 像素宽度的字体大小。
我知道我可以在循环中计算它(类似于while(font.getSize() < panel.getWidth()),但老实说,我觉得它不是很优雅。
您可以使用 FontMetrics 类获取字符串的渲染宽度和高度(确保在 Graphics2D 实例中启用分数字体度量以避免舍入错误):
Graphics2D g = ...;
g.setRenderingHint(
RenderingHints.KEY_FRACTIONALMETRICS,
RenderingHints.VALUE_FRACTIONALMETRICS_ON);
Font font = Font.decode("Times New Roman");
String text = "Foo";
Rectangle2D r2d = g.getFontMetrics(font).getStringBounds(text, g);
Run Code Online (Sandbox Code Playgroud)
现在,当您使用具有默认(或实际上任何)大小的字体获得文本的宽度时,您可以缩放字体,以便文本适合指定的宽度,例如 100px:
font = font.deriveFont((float)(font.getSize2D() * 100/r2d.getWidth()));
Run Code Online (Sandbox Code Playgroud)
同样,您可能必须限制字体大小,以免超出可用的面板高度。
为了改善渲染文本的外观,您还应该考虑为文本渲染启用抗锯齿和/或字体中的字距调整支持:
g.setRenderingHint(
RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
Map<TextAttribute, Object> atts = new HashMap<TextAttribute, Object>();
atts.put(TextAttribute.KERNING, TextAttribute.KERNING_ON);
font = font.deriveFont(atts);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4376 次 |
| 最近记录: |