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