web-dev-qa-db-fra.com

Comment puis-je centrer Graphics.drawString () en Java?

Je travaille actuellement sur le système de menus de mon jeu Java , et je me demande comment centrer le texte de Graphics.drawString(), de sorte que si je veux dessiner un texte dont le point central est à X: 50 et Y: 50, et le texte est 30 pixels de large et 10 pixels de hauteur, le texte commencera à X: 35 et Y: 45.

Puis-je déterminer la largeur du texte avant de le dessiner?
Ce serait alors des calculs faciles.

EDIT: Je me demande également si je peux obtenir la hauteur du texte, afin de pouvoir le centrer verticalement aussi.

Toute aide est appréciée!

29
Daniel Kvist

J'ai utilisé la réponse sur cette question .

Le code que j'ai utilisé ressemble à ceci:

/**
 * Draw a String centered in the middle of a Rectangle.
 *
 * @param g The Graphics instance.
 * @param text The String to draw.
 * @param rect The Rectangle to center the text in.
 */
public void drawCenteredString(Graphics g, String text, Rectangle rect, Font font) {
    // Get the FontMetrics
    FontMetrics metrics = g.getFontMetrics(font);
    // Determine the X coordinate for the text
    int x = rect.x + (rect.width - metrics.stringWidth(text)) / 2;
    // Determine the Y coordinate for the text (note we add the ascent, as in Java 2d 0 is top of the screen)
    int y = rect.y + ((rect.height - metrics.getHeight()) / 2) + metrics.getAscent();
    // Set the font
    g.setFont(font);
    // Draw the String
    g.drawString(text, x, y);
}
57
Daniel Kvist

Lorsque je dois dessiner du texte, j'ai généralement besoin de centrer le texte dans un rectangle englobant.

/**
 * This method centers a <code>String</code> in 
 * a bounding <code>Rectangle</code>.
 * @param g - The <code>Graphics</code> instance.
 * @param r - The bounding <code>Rectangle</code>.
 * @param s - The <code>String</code> to center in the
 * bounding rectangle.
 * @param font - The display font of the <code>String</code>
 * 
 * @see Java.awt.Graphics
 * @see Java.awt.Rectangle
 * @see Java.lang.String
 */
public void centerString(Graphics g, Rectangle r, String s, 
        Font font) {
    FontRenderContext frc = 
            new FontRenderContext(null, true, true);

    Rectangle2D r2D = font.getStringBounds(s, frc);
    int rWidth = (int) Math.round(r2D.getWidth());
    int rHeight = (int) Math.round(r2D.getHeight());
    int rX = (int) Math.round(r2D.getX());
    int rY = (int) Math.round(r2D.getY());

    int a = (r.width / 2) - (rWidth / 2) - rX;
    int b = (r.height / 2) - (rHeight / 2) - rY;

    g.setFont(font);
    g.drawString(s, r.x + a, r.y + b);
}
3
Gilbert Le Blanc