5

幅からJavaAWTフォントサイズを推測する方法を探しています。たとえば、100ピクセル以内に「helloworld」を書きたいと思っています。「Times」というフォントをスタイリッシュFont.PLAINに使用していることはわかっています。指定した幅100ピクセルに最適なフォントサイズを取得したいと考えています。

ループで計算できることは知っていますが(のようなものwhile(font.getSize() < panel.getWidth())、正直なところ、あまりエレガントではありません。

4

2 に答える 2

5

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);
于 2013-01-17T13:43:08.380 に答える
1

私が使用しているこれら2つの方法を見てください。あなたが言うようにエレガントではありませんが、うまくいきます。

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;
}
于 2013-01-17T13:43:09.447 に答える