annotate Clock.java @ 23:9fc8683b8fed

Fixed GUI button presses, had their background change as feedback and added ability to record responses for a probe tone at the end of a sequence
author JShulver
date Wed, 07 Nov 2012 18:22:01 +0000
parents 5080b65e6963
children 014c83185b2a
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
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 }