2012-10-10 47 views
0

但我很滿意我的時鐘輸出 - 但我不確定如何正確對齊我的drawString中的數字,該數字應出現在時鐘上每個刻度標記的頂端。 我希望有人能夠展示適當的方法/公式。在橢圓上畫字符串

private void drawTickMarks(Graphics2D g2) 
    { 
    double radius = this.faceRadius; 

    for (int secs = 0; secs <= 60; secs++) 
    { 
     double tickStart; 

     if (secs % 5 == 0) 
      tickStart = radius - 15; 
      else 
      tickStart = radius - 5; 

     tick = drawRadii(secs/60.0, tickStart, radius); 

     if (secs % 5 == 0) 
      { 
      g2.setStroke(new BasicStroke(3)); 

       g2.drawString(""+(secs/5),(int)tick.getX1()+(int)(tick.getX1()-tick.getX2()), 
                (int)tick.getY1()+(int)(tick.getY1()-tick.getY2())); 
      } 
     else 
      g2.setStroke(new BasicStroke(1)); 


     g2.setColor(Color.WHITE); 
     g2.draw(tick); 
    } 
    } 

感謝Thinhbk與代碼和喬恩·W代表來解決的正確步驟的有效和正確的解決方案。

回答

2

作爲由Jon W提供的解決方案的補充,我創建了一個計算偏移量的方法,而IMO看起來很好。 (@喬恩W:對不起,因爲它是相當長的不加評論你的解決方案)

/** 
    * Calculate the offset  * 
    * @param i 
    * @return array: 
    * 0: x offset 
    * 1: y offset 
    */ 
    private int[] calculateOffSet(int i) { 
     int[] val = new int[2]; 
     int deflt = -12; 
     if(i == 12) { 
      val[0] = -15; 
      val[1] = 9; 
     }else if (i > 6) { 
      val[0] = deflt + i - 6 ; 
      val[1] = i ; 
     }else { 
      val[0] = deflt + i ; 
      val[1] = i + 6;   
     } 
     return val; 
    } 

而在你的代碼,只需調用這個:

int xLocation = (int)tick.getX1()+(int)(tick.getX1()-tick.getX2()); 
int yLocation = (int)tick.getY1()+(int)(tick.getY1()-tick.getY2()); 
int[] offset = calculateOffSet((secs/5)); 
g2.drawString(number, xLocation + offset[0], yLocation + offset[1]); 
+0

它與你的例子完全一致,只要匹配滴答,但數字是覆蓋滴答...我做錯了x,y位置?我做錯了嗎? g2.drawString(「」+(secs/5),(int)tick.getX1()+ offset [0],(int)tick.getY1()+ offset [1]); – Kairan

+0

我剛更新了代碼。 – Thinhbk

4

如果您想象包圍在框中的字符串,則您傳入drawString的x和y值將指定框的左下角。

我會修改drawString行這樣的:

String number = ""+(secs/5); 
int xLocation = (int)tick.getX1()+(int)(tick.getX1()-tick.getX2()); 
int yLocation = (int)tick.getY1()+(int)(tick.getY1()-tick.getY2()); 
int offsetX = /*Insert some value here to shift the position of all the strings 
       along the x-axis. Make this an expression that contains number.length(), 
       so that two-digit numbers are shifted more than one digit numbers. */ 
int offsetY = /*Insert some value here to shift the position of all the strings along 
       the y-axis.*/ 
g2.drawString(number, xLocation + offsetX, yLocation + offsetY); 

你必須用特定的值來玩耍的offsetXoffsetY以使它看起來不錯。

如果你想要更有趣,並使drawString將根據正在使用的字體自動調整位置,請參閱thisFontMetrics類。你會想要使offsetXoffsetY根據字符的寬度和高度以及不同而變化。

+0

+1看到使用的也是這個【示例一個'GlyphVector'](http://stackoverflow.com/a/6296381/418556)來獲得大小。 –