Java字体大小从宽度

我正在寻找一种从宽度推断Java AWT字体大小的方法。 例如,我知道我想在100像素内写下’hello world’。 我知道我在Font.PLAIN样式中使用字体“Times”,我希望得到最适合我的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); 

现在,当您使用具有默认(或实际上任何)大小的字体的文本宽度时,您可以缩放字体,以便文本适合指定的宽度,例如100px:

 font = font.deriveFont((float)(font.getSize2D() * 100/r2d.getWidth())); 

同样,您可能必须限制字体大小,以便不超过可用的面板高度。

要改善渲染文本的外观,还应考虑在字体中启用文本渲染和/或字距调整支持的抗锯齿:

 g.setRenderingHint( RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); Map atts = new HashMap(); atts.put(TextAttribute.KERNING, TextAttribute.KERNING_ON); font = font.deriveFont(atts); 

看看我正在使用的这两种方法。 你说的并不优雅,但它有效。

 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; }