2

文字列を描く四角形を描いています。この文字列は中央に配置する必要があります (機能します) が、「すべての」文字列がこの四角形に収まるようにサイズも変更されます。

センタリングは機能しますが、それを含めますので、この質問は、長方形の文字列を中央に配置してサイズを変更したい他の人に役立つかもしれません。

問題は、While ループが無限であることです。Rectangle2D は常に同じサイズです...

public void paint(Graphics g) {
    Graphics2D g2 = (Graphics2D) g;

    ... other paintings ...

    Font font = new Font("Courier new", Font.BOLD, MAX_FONTSIZE);

    // resize string
    Rectangle2D fontRec = font.getStringBounds(information, g2.getFontMetrics().getFontRenderContext());
    while(fontRec.getWidth() >= width  * 0.95f || fontRec.getHeight() >= height  * 0.95f){
        Font smallerFont = font.deriveFont((float) (font.getSize() - 2));
        g2.setFont(smallerFont);
        fontRec = smallerFont.getStringBounds(information, 
        g2.getFontMetrics().getFontRenderContext());
    }

    // center string
    FontMetrics fm = g2.getFontMetrics();
    float stringWidth = fm.stringWidth(information);
    int fontX = (int) (x + width / 2 - stringWidth / 2);
    int fontY = (int) (y + height / 2);
    g2.drawString(information, fontX, fontY);
}

修正は次のとおりです。

public void paint(Graphics g) {
    Graphics2D g2 = (Graphics2D) g;

        ... other paintings ...

    // resize string
    Rectangle2D fontRec = font.getStringBounds(information, g2.getFontMetrics().getFontRenderContext());
    while(fontRec.getWidth() >= width  * 0.95f || fontRec.getHeight() >= height  * 0.95f){
        Font smallerFont = font.deriveFont((float) (font.getSize() - 2));
        font = smallerFont;
        g2.setFont(smallerFont);
        fontRec = smallerFont.getStringBounds(information, g2.getFontMetrics().getFontRenderContext());
    }

    // center string
    FontMetrics fm = g2.getFontMetrics();
    float stringWidth = fm.stringWidth(information);
    int fontX = (int) (x + width / 2 - stringWidth / 2);
    int fontY = (int) (y + height / 2);
    g2.drawString(information, fontX, fontY);

}

このコードは、文字列を適切に中央揃えしてサイズ変更します。

4

1 に答える 1