我目前工作的菜單系統爲我的Java遊戲,我不知道如何可以從Graphics.drawString()
文本居中,所以如果我想繪製文本的中心點在X: 50
和Y: 50
,以及文字爲30
像素寬,10
像素高,文本將從X: 35
和Y: 45
開始。如何在Java中使用Graphics.drawString()?
我可以在繪製文本之前確定文本的寬度嗎?
那麼這將是簡單的數學。
編輯:我也想知道如果我能得到文本的高度,以便我可以垂直居中。
任何幫助表示讚賞!
我目前工作的菜單系統爲我的Java遊戲,我不知道如何可以從Graphics.drawString()
文本居中,所以如果我想繪製文本的中心點在X: 50
和Y: 50
,以及文字爲30
像素寬,10
像素高,文本將從X: 35
和Y: 45
開始。如何在Java中使用Graphics.drawString()?
我可以在繪製文本之前確定文本的寬度嗎?
那麼這將是簡單的數學。
編輯:我也想知道如果我能得到文本的高度,以便我可以垂直居中。
任何幫助表示讚賞!
我在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);
}
如果圖形g來自系統,則不應該處理它。 –
請注意,此方法不使用給定矩形的x和y。相反,它應該是int x = rect.x +(rect.width - metrics.stringWidth(text))/ 2;和int y = rect.y +((rect.height - metrics.getHeight())/ 2)+ metrics.getAscent(); –
@IshanJain好的,我已經更新了答案。 –
當我不得不繪製文本時,我通常需要將文本居中在一個邊界矩形中。
/**
* 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);
}
看起來像這樣重複:http://stackoverflow.com/questions/258486/calculate-the-display-width-of-a- string-in-java – mwarren
這是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
@mwarren它部分是重複的,但是有一件事。我想知道我怎樣才能得到文本的高度,因爲'FontMetrics.getHeight()/ 2'不會給我一半的文本的「真實」高度...... @richj我已經做得很好了,所以我認爲我不會切換到JavaFX。這將是另一場比賽。 –