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 閱讀(550) 評論(0)  編輯  收藏 所屬分類: Java的時鐘

          導航

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

          統計

          常用鏈接

          留言簿(52)

          隨筆分類

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 林西县| 志丹县| 含山县| 天台县| 井冈山市| 无锡市| 博野县| 师宗县| 江山市| 淮阳县| 上蔡县| 梁河县| 班戈县| 麦盖提县| 太原市| 榆树市| 临海市| 尉氏县| 宿迁市| 广平县| 太原市| 白玉县| 元谋县| 崇仁县| 汾阳市| 比如县| 嘉荫县| 马鞍山市| 子洲县| 湖北省| 仪征市| 九寨沟县| 三河市| 舟曲县| 张家港市| 上蔡县| 商南县| 双江| 内黄县| 文昌市| 黄陵县|