annotate Clock.java @ 52:76e99859bdb4 tip

Add class files for previous changes.
author Marcus Pearce <marcus.pearce@eecs.qmul.ac.uk>
date Wed, 25 Feb 2015 10:11:04 +0000
parents 014c83185b2a
children
rev   line source
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 }