zeyuphoenix

愿我爱的人快乐,愿爱我的人快乐,为了这些,我愿意不快乐.

指针时钟改进(增加计时器)

现在很多指针时钟都有一个小的计时表,这里把上次的指针时钟改进一下,增加一个简单的秒表功能,首先确定的是以前的指针时钟是不修改的,只是在它的基础上再绘制一个小的只有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);

然后复写doTransformpaintComponent方法,增加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;

    }

就可以使用了.

posted on 2010-04-06 22:08 zeyuphoenix 阅读(515) 评论(0)  编辑  收藏 所属分类: Java的时钟

导航

<2010年4月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

统计

常用链接

留言簿(52)

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜