2014-12-30 14 views
15

Tôi hiện đang làm việc trên hệ thống menu cho Java trò chơi của tôi, và tôi tự hỏi làm thế nào tôi có thể tập trung các văn bản từ Graphics.drawString(), do đó nếu tôi muốn vẽ một văn bản có điểm trung tâm là tại X: 50Y: 50, và văn bản có chiều rộng là 30 pixel và cao hơn 10 pixel, văn bản sẽ bắt đầu tại X: 35Y: 45.Làm thế nào tôi có thể tập trung vào Graphics.drawString() trong Java?

Tôi có thể xác định chiều rộng của văn bản trước khi vẽ không?
Sau đó, nó sẽ được dễ dàng toán học.

EDIT: Tôi cũng tự hỏi liệu tôi có thể nhận được chiều cao của văn bản hay không, để tôi có thể căn giữa theo chiều dọc.

Mọi trợ giúp đều được đánh giá cao!

+2

Trông giống như một bản sao về điều này: http://stackoverflow.com/questions/258486/calculate-the-display-width-of-a- string-in-java – mwarren

+0

Đây là thứ mà Swing khiến bạn làm việc. Hãy thử câu trả lời này: http://stackoverflow.com/questions/23729944/java-how-to-visually-center-a-specific-string-not-just-a-font-in-a-rectangle Nếu bạn vừa mới bắt đầu viết trò chơi của bạn, JavaFX là bộ công cụ đồ họa hiện đại nhất được bao gồm trong nền tảng Java và có thể là lựa chọn tốt hơn so với Swing. – richj

+0

@mwarren Nó là một phần trùng lặp, nhưng có một điều tuy nhiên. Tôi tự hỏi làm thế nào tôi có thể nhận được chiều cao của văn bản, bởi vì 'FontMetrics.getHeight()/2' không cho tôi một nửa chiều cao" thực "của văn bản ... @richj Tôi đã làm khá nhiều rồi , vì vậy tôi nghĩ rằng tôi sẽ không chuyển sang JavaFX. Đó sẽ là một trò chơi khác. –

Trả lời

34

Tôi đã sử dụng câu trả lời trên this question.

Mã Tôi đã từng trông giống như sau:

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

Nếu Đồ họa g xuất phát từ hệ thống, bạn không nên vứt bỏ nó. –

+1

Xin lưu ý rằng phương pháp này không sử dụng x và y của hình chữ nhật cho sẵn. Thay vào đó, nó phải là int x = rect.x + (rect.width - metrics.stringWidth (text))/2; và int y = rect.y + ((rect.height - metrics.getHeight())/2) + metrics.getAscent(); –

+1

@IshanJain Điểm tốt, tôi đã cập nhật câu trả lời. –

2

Khi tôi phải vẽ văn bản, tôi thường cần căn giữa văn bản trong hình chữ nhật bao quanh.

/** 
* 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); 
} 
Các vấn đề liên quan