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

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta name="ProgId" content="Word.Document"> <meta name="Generator" content="Microsoft Word 12"> <meta name="Originator" content="Microsoft Word 12"> <link rel="File-List" href="file:///C:%5CDOCUME%7E1%5Cphoenix%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml"> <link rel="Edit-Time-Data" href="file:///C:%5CDOCUME%7E1%5Cphoenix%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_editdata.mso"> <!--[if !mso]> <style> v":* {behavior:url(#default#VML);} o":* {behavior:url(#default#VML);} w":* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} </style> <![endif]--><link rel="themeData" href="file:///C:%5CDOCUME%7E1%5Cphoenix%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx"> <link rel="colorSchemeMapping" href="file:///C:%5CDOCUME%7E1%5Cphoenix%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml"> <!--[if gte mso 9]><xml> Normal 0 false 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE </xml><![endif]--><!--[if gte mso 9]><![endif]--><style> <!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1;} @font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4;} @font-face {font-family:Calibri; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-alt:"Times New Roman";} @font-face {font-family:""@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal { mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; font-family:"Calibri","serif"; mso-bidi-font-family:"Times New Roman";} .MsoChpDefault { mso-bidi-font-family:"Times New Roman";} /* Page Definitions */ @page {} @page Section1 {size:595.3pt 841.9pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; layout-grid:15.6pt;} div.Section1 {page:Section1;} --> </style> <!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable { mso-style-parent:""; font-size:10.5pt; font-family:"Calibri","serif";} </style> <![endif]-->

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

界面图如下:



<!--[if gte vml 1]> <![endif]-->

<!--[if gte vml 1]> <![endif]-->

工程目录结构如下:

<!--[if gte vml 1]> <![endif]-->

首先要说的类就是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;

    }

就可以使用了.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值