m@0
|
1 import java.awt.*;
|
m@0
|
2 import java.awt.geom.*;
|
m@0
|
3 import javax.swing.*;
|
m@0
|
4
|
m@0
|
5 /** Clocks displayed in a panel. */
|
m@0
|
6 public class Clock extends JPanel implements Runnable {
|
m@0
|
7
|
m@0
|
8 /* The default colours */
|
m@0
|
9 static final Color BACKGROUND = Color.black;
|
m@0
|
10 static final Color FOREGROUND = Color.white;
|
m@0
|
11
|
m@0
|
12 /* Panel width, height and border. */
|
m@0
|
13 public static final int WIDTH = 450;
|
m@0
|
14 public static final int BORDER = 50;
|
m@0
|
15
|
m@0
|
16 /* Minutes in a day. */
|
m@0
|
17 public static final int ONE_DAY = 24 * 60;
|
m@0
|
18
|
m@0
|
19 /* Show the clock? */
|
m@0
|
20 public Boolean showClock = false;
|
m@0
|
21 public Boolean showFullClock = false;
|
m@0
|
22
|
m@0
|
23 /* minutes since midnight, range 0 to (ONE_DAY - 1) inclusive */
|
m@0
|
24 private int minutes = 0;
|
m@0
|
25
|
m@0
|
26 /* Milliseconds per tick of the minute hand */
|
m@0
|
27 private long millisecondsPerTick = 1000;
|
m@0
|
28 public void setMillisecondsPerTick(long n) { millisecondsPerTick = n; }
|
m@0
|
29
|
jeremy@27
|
30 private boolean debug;
|
jeremy@27
|
31
|
m@0
|
32 /* Create a new Clock at time midnight. */
|
jeremy@27
|
33 public Clock(boolean d) {
|
m@0
|
34 this.setBackground(BACKGROUND);
|
m@0
|
35 this.setPreferredSize (new Dimension (WIDTH, WIDTH));
|
jeremy@27
|
36 debug = d;
|
m@0
|
37 }
|
m@0
|
38
|
m@0
|
39 public void run() {
|
m@0
|
40 reset();
|
m@0
|
41 if (showClock == false) {
|
m@0
|
42 showClock = true;
|
m@0
|
43 repaint();
|
m@0
|
44 }
|
m@0
|
45 for (int i = 0; i < 60; i++) {
|
m@0
|
46 try { Thread.sleep (millisecondsPerTick); }
|
m@0
|
47 catch (InterruptedException e) {}
|
m@0
|
48 tick(1);
|
m@0
|
49 repaint();
|
m@0
|
50 }
|
m@4
|
51 showClock = false;
|
m@4
|
52 showFullClock = false;
|
jeremy@27
|
53 if (debug)
|
jeremy@27
|
54 System.out.println("RUN CLOCK");
|
m@4
|
55 reset();
|
JShulver@23
|
56 revalidate();
|
m@4
|
57 repaint();
|
m@4
|
58 }
|
m@0
|
59
|
m@0
|
60 /* Move time on by 1 second. */
|
m@0
|
61 public void tick(int n) {
|
m@0
|
62 minutes = (minutes + n) % ONE_DAY;
|
m@0
|
63 }
|
m@0
|
64
|
m@0
|
65 /* Reset the clock to 00:00. */
|
m@0
|
66 public void reset() {
|
jeremy@27
|
67 if (debug)
|
jeremy@27
|
68 System.out.println("RESET!");
|
m@0
|
69 minutes = 0;
|
m@0
|
70 }
|
m@0
|
71
|
m@0
|
72 /* Draw the clock or fixation point. */
|
m@0
|
73 public void paintComponent (Graphics g) {
|
JShulver@23
|
74 super.paintComponent (g);
|
m@0
|
75
|
m@0
|
76 if (showClock == true) {
|
m@0
|
77 paintClock(g);
|
m@0
|
78 } else {
|
JShulver@23
|
79 paintFixationPoint(g);
|
m@0
|
80 }
|
JShulver@23
|
81 //just ensure that java knows we want to draw new things
|
JShulver@23
|
82 revalidate();
|
m@0
|
83 }
|
m@0
|
84
|
m@0
|
85 private void paintFixationPoint(Graphics g) {
|
m@4
|
86 //System.out.println("paintFixationPoint");
|
m@0
|
87 int left_edge = BORDER;
|
m@0
|
88 int top = BORDER;
|
m@0
|
89 int diameter = WIDTH - (BORDER * 2);
|
m@0
|
90 int centrex = left_edge + (diameter / 2);
|
m@0
|
91 int centrey = top + (diameter / 2);
|
m@0
|
92
|
m@0
|
93 int linelength = diameter / 20;
|
m@0
|
94
|
m@0
|
95 g.setColor(FOREGROUND);
|
m@0
|
96 g.drawLine(centrey, centrex - linelength, centrey, centrex + linelength);
|
m@0
|
97 g.drawLine(centrey - linelength, centrex, centrey + linelength, centrex);
|
m@0
|
98 }
|
m@0
|
99
|
m@0
|
100 private void paintClock (Graphics g) {
|
m@4
|
101 //System.out.println("paintClock");
|
m@0
|
102 int minutes_angle = 90 - ((minutes % 60) * 6);
|
m@0
|
103 int hours_angle = 90 - ((minutes / 60) * 30);
|
m@0
|
104 int left_edge = BORDER;
|
m@0
|
105 int top = BORDER;
|
m@0
|
106 int diameter = WIDTH - (BORDER * 2);
|
JShulver@23
|
107 int radius = diameter / 2;
|
m@0
|
108 int centrex = left_edge + radius;
|
m@0
|
109 int centrey = top + radius;
|
m@0
|
110
|
m@0
|
111 g.setColor(FOREGROUND);
|
m@0
|
112
|
m@0
|
113 // draw the clock as a black circle:
|
m@0
|
114 g.drawOval(left_edge, top, diameter, diameter);
|
m@0
|
115
|
m@0
|
116 // draw the hour numbers
|
JShulver@23
|
117 int offset = 0;
|
m@0
|
118 for(int i = 1; i <= 12; i++) {
|
m@0
|
119 int hours_pos = 90 - (i * 30);
|
m@0
|
120 int x = (centrex - offset) +
|
m@0
|
121 (int)((radius - 5) * Math.cos(hours_pos * Math.PI / 180));
|
m@0
|
122 int y = (centrey + offset) -
|
m@0
|
123 (int)((radius - 5) * Math.sin(hours_pos * Math.PI / 180));
|
m@0
|
124 //g.drawString(String.valueOf(i), x, y);
|
m@0
|
125 g.drawOval(x, y, diameter / 200, diameter / 200);
|
m@0
|
126 }
|
m@0
|
127
|
m@0
|
128 // get the coordinate of the line_ends
|
m@0
|
129 int minutesx = (int)((radius - 5) *
|
m@0
|
130 Math.cos(minutes_angle * Math.PI / 180));
|
m@0
|
131 int minutesy = (int)((radius - 5) *
|
m@0
|
132 Math.sin(minutes_angle * Math.PI /180));
|
m@0
|
133
|
m@0
|
134 // draw the minutes' hand
|
m@0
|
135 g.drawLine(centrex, centrey, centrex + minutesx, centrey - minutesy);
|
m@0
|
136
|
m@0
|
137 int arc_angle = minutes_angle - 90;
|
m@0
|
138 Graphics2D g2 = (Graphics2D)g;
|
m@0
|
139 g2.setPaint(FOREGROUND);
|
m@0
|
140
|
jeremy@27
|
141 if (debug)
|
jeremy@27
|
142 System.out.println("minutes_angle = " + minutes_angle +
|
JShulver@23
|
143 "; arc_angle = " + arc_angle);
|
m@0
|
144
|
m@0
|
145 if (arc_angle == 0 & showFullClock == true) {
|
m@0
|
146 g2.fillOval(left_edge, top, diameter, diameter);
|
m@0
|
147 showFullClock = false;
|
m@0
|
148 } else {
|
m@0
|
149 showFullClock = true;
|
m@0
|
150 if (arc_angle >= -180) {
|
m@0
|
151 Arc2D pie = new Arc2D.Float(centrex - radius, centrey - radius,
|
m@0
|
152 2 * radius, 2 * radius,
|
m@0
|
153 90, arc_angle,
|
m@0
|
154 Arc2D.PIE);
|
m@0
|
155 g2.fill(pie);
|
m@0
|
156 } else {
|
m@0
|
157 Arc2D pie1 = new Arc2D.Float(centrex - radius, centrey - radius,
|
m@0
|
158 2 * radius, 2 * radius,
|
m@0
|
159 90, -180, Arc2D.PIE);
|
m@0
|
160 Arc2D pie2 = new Arc2D.Float(centrex - radius, centrey - radius,
|
m@0
|
161 2 * radius, 2 * radius,
|
m@0
|
162 270, arc_angle + 180,
|
m@0
|
163 Arc2D.PIE);
|
m@0
|
164 g2.fill(pie1);
|
m@0
|
165 g2.fill(pie2);
|
m@0
|
166 }
|
m@0
|
167 }
|
m@0
|
168 }
|
m@0
|
169 }
|