2014-12-30 27 views
15

Attualmente sto lavorando sul sistema di menu per la mia Java gioco, e mi chiedo come posso centrare il testo da Graphics.drawString(), in modo che se voglio disegnare un testo il cui punto centrale è a X: 50 e Y: 50, e la il testo è 30 pixel di larghezza e 10 di altezza, il testo inizierà da X: 35 e Y: 45.Come posso centrare Graphics.drawString() in Java?

Posso determinare la larghezza del testo prima di disegnarlo?
Quindi sarebbe facile matematica.

MODIFICA: Mi chiedo anche se riesco a ottenere l'altezza del testo, in modo che possa centrarlo anche verticalmente.

Qualsiasi aiuto è apprezzato!

+2

Sembra un duplicato di questo: http://stackoverflow.com/questions/258486/calculate-the-display-width-of-a- string-in-java – mwarren

+0

Questo è qualcosa su cui Swing ti fa lavorare. Prova questa risposta: http://stackoverflow.com/questions/23729944/java-how-to-visually-center-a-specific-string-not-just-a-font-in-a-rectangle Se hai appena ha iniziato a scrivere il tuo gioco, JavaFX è il più moderno kit di strumenti grafici incluso con la piattaforma Java e potrebbe essere una scelta migliore rispetto a Swing. – richj

+0

@mwarren È in parte un duplicato, ma c'è comunque una cosa. Mi chiedo come posso ottenere l'altezza del testo, perché 'FontMetrics.getHeight()/2' non mi dà la metà dell'altezza" reale "del testo ... @richj Ho già fatto abbastanza , quindi penso che non passerò a JavaFX. Questo sarà per un altro gioco. –

risposta

34

Ho utilizzato la risposta su this question.

Il codice che ho usato sembra qualcosa di simile:

/** 
* 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); 
} 
+11

Se la grafica g proviene dal sistema, non è necessario smaltirla. –

+1

Si noti che questo metodo non usa x e y del rettangolo dato. Invece dovrebbe essere int x = rect.x + (rect.width - metrics.stringWidth (testo))/2; e int y = rect.y + ((rect.height - metrics.getHeight())/2) + metrics.getAscent(); –

+1

@IshanJain Buon punto, ho aggiornato la risposta. –

2

Quando devo disegnare del testo, di solito ho bisogno di centrare il testo in un rettangolo di delimitazione.

/** 
* 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); 
}