我正在寻找一种从宽度推断Java AWT字体大小的方法。例如,我知道我想写“你好世界”。在100像素内。我知道我在样式Font.PLAIN
中使用了字体" Times",我希望得到的字体大小最适合我给定的100像素宽度。
我知道我可以在一个循环中计算它(类似于while(font.getSize() < panel.getWidth()
),但说实话,我发现它并不优雅。
答案 0 :(得分:4)
您可以使用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);
现在,当您使用具有默认(或实际上任意)大小的字体的文本宽度时,您可以缩放字体,以便文本适合指定的宽度,例如100px的:
font = font.deriveFont((float)(font.getSize2D() * 100/r2d.getWidth()));
同样,您可能必须限制字体大小,以便不超过可用的面板高度。
要改善渲染文本的外观,还应考虑在字体中启用文本渲染和/或字距调整支持的抗锯齿:
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);
答案 1 :(得分:1)
看看我正在使用的这两种方法。你说的并不优雅,但它有效。
private static int pickOptimalFontSize (Graphics2D g, String title, int width, int height) {
Rectangle2D rect = null;
int fontSize = 30; //initial value
do {
fontSize--;
Font font = Font("Arial", Font.PLAIN, fontSize);
rect = getStringBoundsRectangle2D(g, title, font);
} while (rect.getWidth() >= width || rect.getHeight() >= height);
return fontSize;
}
public static Rectangle2D getStringBoundsRectangle2D (Graphics g, String title, Font font) {
g.setFont(font);
FontMetrics fm = g.getFontMetrics();
Rectangle2D rect = fm.getStringBounds(title, g);
return rect;
}