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