2014-08-27 20 views
0

有一個圓形(行星),通過fillOval()繪製。我需要將文字(數字)寫在圓圈上,以便它必須始終與中心對齊。圓的中心和半徑。 據我所知,我需要計算文本的寬度和長度(由getStringBounds嘗試),但無法正常工作。Circle中心的文字

protected void paintComponent(Graphics g){ 
    super.paintComponent(g); 
    Graphics2D g2d = (Graphics2D) g.create(); 
    for (Planet planet : planets) { 
     g2d.setColor(planet.getColor()); 
     g2d.fillOval((int) planet.getX() - planet.getRadius(), (int) planet.getY() - planet.getRadius(), 
     planet.getRadius() * 2, planet.getRadius() * 2); 
     g.setFont(new Font("Serif", Font.PLAIN, 20)); 
     g.setColor(Color.black); 
     String s = String.valueOf(250); 
     FontMetrics fm = g.getFontMetrics(); 
     double textWidth = fm.getStringBounds(s, g).getWidth(); 
     g.setColor(Color.white); 
     g.drawString(s, (int) ((int) planet.getX() - textWidth/2), ((int) planet.getY() + fm.getMaxAscent()/2));}} 
+3

請創建併發佈一個小而簡單的完整程序,說明您的問題,[MCVE](http://stackoverflow.com/help/mcve)。請檢查鏈接瞭解這個非常有用的工具的詳細信息。 – 2014-08-27 13:11:13

+1

基本的想法似乎沒問題(儘管你可能想要'(int)planet.getY() - fm.getMaxAscent()/ 2)'),那麼它是如何工作的?文本有多遠? textWidth的價值是什麼,這個星球的地位是什麼? – nos 2014-08-27 13:13:50

+0

'但不能正常工作。「 - 這是什麼意思?它總是在右/左/上/下。我們不介意讀者。我們無法猜測你的問題是什麼。 – camickr 2014-08-27 14:19:59

回答

1

您使用planet.getX()-planet.getRadius()planet.getY() - planet.getRadius()計算你爲中心的圓的點。

然後,你必須添加要在中心位置,其計算

planet.getX() - planet.getRadius() - textWidth/2 //or centered point - textWidth/2 

畫的文字是你的x座標和

planet.getY() - planet.getRadius() + fm.getMaxAscent()/2 //or centered point + fm.getMaxAscent()/2 

這將是Y-座標。

但是,你正在使用planet.getX() - textWidth/2

這個原點必須是圓的中心,而不是planet.getX()

1

在過去我不得不同時使用上升/下降值來計算實際的字體身高,它看起來像你只是使用上升。需要考慮的事情:並非所有字符串對於給定字體都具有相同的最大上升/下降,所以雖然字符串「Dojo」看起來可以正確垂直對齊,但字符串「cujo」和「coco」可能不會。

另一個建議:不是計算文本的半角寬度,而是使用它來抵消繪圖起始位置,爲什麼不只是將文本居中對齊?