现在很多指针时钟都有一个小的计时表,这里把上次的指针时钟改进一下,增加一个简单的秒表功能,首先确定的是以前的指针时钟是不修改的,只是在它的基础上再绘制一个小的只有1个指针的时钟.
界面图如下:
 
 
工程目录结构如下:
 
首先要说的类就是StopwatchParts类
/**
 * To define all modules which a analog-type stopwatch
consists of.
 */
publicabstractclass StopwatchParts
extends RotateParts {
它和BasicParts几乎完全一致,也是继承于RotateParts,唯一区别是BasicParts需要画时分秒,它只需要画一个指针.
先看它的属性:
    /**
     * Millisecond hand.
     */
    protected Shape millisecondHand;
    /**
     * Millisecond hand
behavior controller.
     */
    protected AffineTransform millisecondTransform;
这2个属性提供计时时针的形状和绘制映射类,通过它们可以对钟表进行绘制.
    /**
     * Moves all parts, to
leave some margin.
     */
    protectedtransient AffineTransform trans;
这个属性是在对时分秒指针绘制时提供变换的.
再看它的构造函数
/**
* Constructor: Joins every
parts in a entire analog-type clock.
*/
    protected StopwatchParts(Shape dial, Shape millisecondHand)
需要传入外围图形、指针图形.当然可以传入new GeneralPath()
在以后再具体描绘它们.
    /**
     * Initializes hand
transformation. 
     */
    protectedvoid initTransform() {
        millisecondTransform = getTransform();
    }
这个是初始化指针绘制映射类的.默认让它们都指向12点方向.
    /**
     * Default algorithm for
hands's action trace.
     */
    @Override
    publicvoid doTransform(int hour, int minute, int second, int millisecond) {
       if (millisecondTransform != null) {
           setToRotation(millisecondTransform, millisecond / 100.0, 10);
       }
    }
这个是父类的虚函数的实现,根据给定值旋转指定角度呈现给画面.
最后是重要的paintComponent方法了
    @Override
    publicvoid paintComponent(Graphics g) {
它按照属性了上面取得的绘制映射类进行绘制
首先是绘制外围界面:
        if (dial != null) {
              g2.setPaint(Color.black);
              g2.draw(trans.createTransformedShape(dial));
           }
然后是绘制指针:
       // Draw millisecond hand
       g2.setPaint(Color.red);
       g2.fill(trans.createTransformedShape(millisecondTransform
              .createTransformedShape(millisecondHand)));
基本和BasicParts绘制时一样的.
然后是MyStopwatchParts类,它和MyParts类一致,只是构造函数比较简单
public MyStopwatchParts(float x, float y, float width) throws Exception {
只需要配置计时时钟的位置和大小就可以了.
在绘制时也只需要绘制一个指针和简单的几个标示点.
    @Override
    publicvoid paintComponent(Graphics g) {
       super.paintComponent(g);
       // Draw 10 ticks
       drawTicks(g, 10);
    }
基本可以参考MyParts类秒针的绘制.
最后就是合并类MyPartsWithStopwatch了,它是在MyParts的基础上绘制新创立的计时时钟MyStopwatchParts,先看继承关系:
/**
 * To implement a analog-type clock with stopwatch.<br>
 */
publicclass MyPartsWithStopwatch extends MyParts {
然后是它的属性:
    /**
     * The stopwatch
parts.
     */
    private MyStopwatchParts stopwatch;
它就是需要在指针时钟上绘制的组建.
然后是方法,它在构造函数里初始化stopwatch
stopwatch = new MyStopwatchParts(sx, sy, sWidth);
然后复写doTransform和paintComponent方法,增加stopwatch的刷新:
    /**
     */
    @Override
 publicvoid doTransform(int hour, int minute, int second, int millisecond) {
       super.doTransform(hour, minute, second, millisecond);
       stopwatch.doTransform(hour, minute, second, millisecond);
    }
    /**
     */
    @Override
    publicvoid paintComponent(Graphics
g) {
       super.paintComponent(g);
       stopwatch.paintComponent(g);
    }
这个绘制类就完成了.
到此为止,所有的指针时钟的创立工作全部完成.
最后通过
    /**
     * This method shows how to
create a user defined analog-type clock
     */
    private AnalogClock getColorfulClock() {
       if (colorfulClock == null) {
           try {
           colorfulClock = new AnalogClock(new MyPartsWithStopwatch ());
           } catch (Exception e) {
              e.printStackTrace();
           }
       }
       returncolorfulClock;
    }
就可以使用了.