現在很多指針時鐘都有一個小的計時表,這里把上次的指針時鐘改進一下,增加一個簡單的秒表功能,首先確定的是以前的指針時鐘是不修改的,只是在它的基礎上再繪制一個小的只有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;
}
就可以使用了.