2014-12-30 55 views
15

我目前工作的菜單系統爲我的Java遊戲,我不知道如何可以從Graphics.drawString()文本居中,所以如果我想繪製文本的中心點在X: 50Y: 50,以及文字爲30像素寬,10像素高,文本將從X: 35Y: 45開始。如何在Java中使用Graphics.drawString()?

我可以在繪製文本之前確定文本的寬度嗎?
那麼這將是簡單的數學。

編輯:我也想知道如果我能得到文本的高度,以便我可以垂直居中。

任何幫助表示讚賞!

+2

看起來像這樣重複:http://stackoverflow.com/questions/258486/calculate-the-display-width-of-a- string-in-java – mwarren

+0

這是Swing讓你工作的東西。試試這個答案:http://stackoverflow.com/questions/23729944/java-how-to-visually-center-a-specific-string-not-just-a-font-in-a-rectangle如果你只是開始編寫遊戲,JavaFX是Java平臺中包含的最現代的圖形工具包,可能是比Swing更好的選擇。 – richj

+0

@mwarren它部分是重複的,但是有一件事。我想知道我怎樣才能得到文本的高度,因爲'FontMetrics.getHeight()/ 2'不會給我一半的文本的「真實」高度...... @richj我已經做得很好了,所以我認爲我不會切換到JavaFX。這將是另一場比賽。 –

回答

34

我在this question上使用了答案。

我使用的代碼看起來是這樣的:

/** 
* 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

如果圖形g來自系統,則不應該處理它。 –

+1

請注意,此方法不使用給定矩形的x和y。相反,它應該是int x = rect.x +(rect.width - metrics.stringWidth(text))/ 2;和int y = rect.y +((rect.height - metrics.getHeight())/ 2)+ metrics.getAscent(); –

+1

@IshanJain好的,我已經更新了答案。 –

2

當我不得不繪製文本時,我通常需要將文本居中在一個邊界矩形中。

/** 
* 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); 
} 
相關問題