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
|
m@0
|
30 /* Create a new Clock at time midnight. */
|
m@0
|
31 public Clock() {
|
m@0
|
32 this.setBackground(BACKGROUND);
|
m@0
|
33 this.setPreferredSize (new Dimension (WIDTH, WIDTH));
|
m@0
|
34 }
|
m@0
|
35
|
m@0
|
36 public void run() {
|
m@0
|
37 reset();
|
m@0
|
38 if (showClock == false) {
|
m@0
|
39 showClock = true;
|
m@0
|
40 repaint();
|
m@0
|
41 }
|
m@0
|
42 for (int i = 0; i < 60; i++) {
|
m@0
|
43 try { Thread.sleep (millisecondsPerTick); }
|
m@0
|
44 catch (InterruptedException e) {}
|
m@0
|
45 tick(1);
|
m@0
|
46 repaint();
|
m@0
|
47 }
|
m@4
|
48 showClock = false;
|
m@4
|
49 showFullClock = false;
|
JShulver@23
|
50 System.out.println("RUN CLOCK");
|
m@4
|
51 reset();
|
JShulver@23
|
52 revalidate();
|
m@4
|
53 repaint();
|
m@4
|
54 }
|
m@0
|
55
|
m@0
|
56 /* Move time on by 1 second. */
|
m@0
|
57 public void tick(int n) {
|
m@0
|
58 minutes = (minutes + n) % ONE_DAY;
|
m@0
|
59 }
|
m@0
|
60
|
m@0
|
61 /* Reset the clock to 00:00. */
|
m@0
|
62 public void reset() {
|
JShulver@23
|
63 System.out.println("RESET!");
|
m@0
|
64 minutes = 0;
|
m@0
|
65 }
|
m@0
|
66
|
m@0
|
67 /* Draw the clock or fixation point. */
|
m@0
|
68 public void paintComponent (Graphics g) {
|
JShulver@23
|
69 super.paintComponent (g);
|
m@0
|
70
|
m@0
|
71 if (showClock == true) {
|
m@0
|
72 paintClock(g);
|
m@0
|
73 } else {
|
JShulver@23
|
74 paintFixationPoint(g);
|
m@0
|
75 }
|
JShulver@23
|
76 //just ensure that java knows we want to draw new things
|
JShulver@23
|
77 revalidate();
|
m@0
|
78 }
|
m@0
|
79
|
m@0
|
80 private void paintFixationPoint(Graphics g) {
|
m@4
|
81 //System.out.println("paintFixationPoint");
|
m@0
|
82 int left_edge = BORDER;
|
m@0
|
83 int top = BORDER;
|
m@0
|
84 int diameter = WIDTH - (BORDER * 2);
|
m@0
|
85 int centrex = left_edge + (diameter / 2);
|
m@0
|
86 int centrey = top + (diameter / 2);
|
m@0
|
87
|
m@0
|
88 int linelength = diameter / 20;
|
m@0
|
89
|
m@0
|
90 g.setColor(FOREGROUND);
|
m@0
|
91 g.drawLine(centrey, centrex - linelength, centrey, centrex + linelength);
|
m@0
|
92 g.drawLine(centrey - linelength, centrex, centrey + linelength, centrex);
|
m@0
|
93 }
|
m@0
|
94
|
m@0
|
95 private void paintClock (Graphics g) {
|
m@4
|
96 //System.out.println("paintClock");
|
m@0
|
97 int minutes_angle = 90 - ((minutes % 60) * 6);
|
m@0
|
98 int hours_angle = 90 - ((minutes / 60) * 30);
|
m@0
|
99 int left_edge = BORDER;
|
m@0
|
100 int top = BORDER;
|
m@0
|
101 int diameter = WIDTH - (BORDER * 2);
|
JShulver@23
|
102 int radius = diameter / 2;
|
m@0
|
103 int centrex = left_edge + radius;
|
m@0
|
104 int centrey = top + radius;
|
m@0
|
105
|
m@0
|
106 g.setColor(FOREGROUND);
|
m@0
|
107
|
m@0
|
108 // draw the clock as a black circle:
|
m@0
|
109 g.drawOval(left_edge, top, diameter, diameter);
|
m@0
|
110
|
m@0
|
111 // draw the hour numbers
|
JShulver@23
|
112 int offset = 0;
|
m@0
|
113 for(int i = 1; i <= 12; i++) {
|
m@0
|
114 int hours_pos = 90 - (i * 30);
|
m@0
|
115 int x = (centrex - offset) +
|
m@0
|
116 (int)((radius - 5) * Math.cos(hours_pos * Math.PI / 180));
|
m@0
|
117 int y = (centrey + offset) -
|
m@0
|
118 (int)((radius - 5) * Math.sin(hours_pos * Math.PI / 180));
|
m@0
|
119 //g.drawString(String.valueOf(i), x, y);
|
m@0
|
120 g.drawOval(x, y, diameter / 200, diameter / 200);
|
m@0
|
121 }
|
m@0
|
122
|
m@0
|
123 // get the coordinate of the line_ends
|
m@0
|
124 int minutesx = (int)((radius - 5) *
|
m@0
|
125 Math.cos(minutes_angle * Math.PI / 180));
|
m@0
|
126 int minutesy = (int)((radius - 5) *
|
m@0
|
127 Math.sin(minutes_angle * Math.PI /180));
|
m@0
|
128
|
m@0
|
129 // draw the minutes' hand
|
m@0
|
130 g.drawLine(centrex, centrey, centrex + minutesx, centrey - minutesy);
|
m@0
|
131
|
m@0
|
132 int arc_angle = minutes_angle - 90;
|
m@0
|
133 Graphics2D g2 = (Graphics2D)g;
|
m@0
|
134 g2.setPaint(FOREGROUND);
|
m@0
|
135
|
JShulver@23
|
136 System.out.println("minutes_angle = " + minutes_angle +
|
JShulver@23
|
137 "; arc_angle = " + arc_angle);
|
m@0
|
138
|
m@0
|
139 if (arc_angle == 0 & showFullClock == true) {
|
m@0
|
140 g2.fillOval(left_edge, top, diameter, diameter);
|
m@0
|
141 showFullClock = false;
|
m@0
|
142 } else {
|
m@0
|
143 showFullClock = true;
|
m@0
|
144 if (arc_angle >= -180) {
|
m@0
|
145 Arc2D pie = new Arc2D.Float(centrex - radius, centrey - radius,
|
m@0
|
146 2 * radius, 2 * radius,
|
m@0
|
147 90, arc_angle,
|
m@0
|
148 Arc2D.PIE);
|
m@0
|
149 g2.fill(pie);
|
m@0
|
150 } else {
|
m@0
|
151 Arc2D pie1 = new Arc2D.Float(centrex - radius, centrey - radius,
|
m@0
|
152 2 * radius, 2 * radius,
|
m@0
|
153 90, -180, Arc2D.PIE);
|
m@0
|
154 Arc2D pie2 = new Arc2D.Float(centrex - radius, centrey - radius,
|
m@0
|
155 2 * radius, 2 * radius,
|
m@0
|
156 270, arc_angle + 180,
|
m@0
|
157 Arc2D.PIE);
|
m@0
|
158 g2.fill(pie1);
|
m@0
|
159 g2.fill(pie2);
|
m@0
|
160 }
|
m@0
|
161 }
|
m@0
|
162 }
|
m@0
|
163 }
|