A clock with no hands and no numbers is just a circle. To change this, a second hand will be drawn using a filled arc.
Since arcs are drawn anticlockwise from 0 (on the right, or 3 o'clock) through 90 degrees (12 o'clock), then 180 degrees (9 o'clock), then 270 degrees (6 o'clock), and finally back to 360 degrees (3 o'clock), it is possible to calculate the arc's position for the second hand using the expression (15 – seconds) * 6 % 360.
drawClock
method of the ClockView
class.seconds
that is initialized to LocalTime.now().getSecond()
.SWT.COLOR_BLUE
via the display, and store it in a local variable, blue
.blue
.public void paintControl(PaintEvent e) { e.gc.drawArc(e.x, e.y, e.width-1, e.height-1, 0, 360); int seconds = LocalTime.now().getSecond(); int arc = (15 - seconds) * 6 % 360; Color blue = e.display.getSystemColor(SWT.COLOR_BLUE); e.gc.setBackground(blue); e.gc.fillArc(e.x, e.y, e.width-1, e.height-1, arc-1, 2); }
The code calculates the position on the arc at which the second hand will need to be drawn. Since the arc degrees go anticlockwise, the seconds have to be negative. The offset of 15 represents the fact that an arc of 0 is at the 3 o'clock position, which is 15 seconds. This is then multiplied by 6 (60 seconds = 360 degrees) and finally the result is calculated modulus 360, to ensure that it's up to 360 degrees (the value can be negative; the arc calculation works in this way as well).
Although drawArc
colors in the foreground color, the fillArc
colors in the background color. The GC maintains two colors; a foreground color and a background color. Normally an SWT Color
object needs to have a dispose
after use, but to simplify this example, the Display
class's getSystemColor
method is used, whose result does not need to be disposed.
Finally, the arc is drawn 2 degrees wide. To center it, the arc starts from pos-1
, so it is drawn from pos-1
to pos+1
.
When the view is resized, a redraw is issued on the canvas, and so the second hand is drawn in the correct position. However, to be useful as a clock, this should be done automatically do this while the view is visible.
3.145.17.46