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と、ソリューションを実現するための適切な手順を提供してくれたJonWに感謝します。

4

2 に答える 2

4

ボックスで囲まれた文字列を想像すると、渡すx値とy値drawStringは、ボックスの左下隅を指定します。

私はそのように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使用しているフォントに応じて場所が自動的に調整されるように、さらに凝ったものにしたい場合は、これFontMetricsクラスを確認してください。描かれているキャラクターの幅や高さなどに応じて、作り方offsetXを変えたいと思うでしょう。offsetY

于 2012-10-10T04:12:52.197 に答える
2

Jon Wが提供するソリューションの補足として、オフセットを計算するメソッドを作成します。IMOは問題ないように見えます。(@Jon 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]);
于 2012-10-10T04:59:34.633 に答える