Mercurial > hg > mep
view Clock.java @ 47:be66ee2fe9fe
Added abstract class EndBlockPanel to deliver end of block messages (e.g. end of practice block).
Added and implemented EndTestPanel which gives "thank you for participating" etc message at end of test.
author | Carl Bussey <c.bussey@se10.qmul.ac.uk> |
---|---|
date | Thu, 13 Jun 2013 18:33:34 +0100 |
parents | 014c83185b2a |
children |
line wrap: on
line source
import java.awt.*; import java.awt.geom.*; import javax.swing.*; /** Clocks displayed in a panel. */ public class Clock extends JPanel implements Runnable { /* The default colours */ static final Color BACKGROUND = Color.black; static final Color FOREGROUND = Color.white; /* Panel width, height and border. */ public static final int WIDTH = 450; public static final int BORDER = 50; /* Minutes in a day. */ public static final int ONE_DAY = 24 * 60; /* Show the clock? */ public Boolean showClock = false; public Boolean showFullClock = false; /* minutes since midnight, range 0 to (ONE_DAY - 1) inclusive */ private int minutes = 0; /* Milliseconds per tick of the minute hand */ private long millisecondsPerTick = 1000; public void setMillisecondsPerTick(long n) { millisecondsPerTick = n; } private boolean debug; /* Create a new Clock at time midnight. */ public Clock(boolean d) { this.setBackground(BACKGROUND); this.setPreferredSize (new Dimension (WIDTH, WIDTH)); debug = d; } public void run() { reset(); if (showClock == false) { showClock = true; repaint(); } for (int i = 0; i < 60; i++) { try { Thread.sleep (millisecondsPerTick); } catch (InterruptedException e) {} tick(1); repaint(); } showClock = false; showFullClock = false; if (debug) System.out.println("RUN CLOCK"); reset(); revalidate(); repaint(); } /* Move time on by 1 second. */ public void tick(int n) { minutes = (minutes + n) % ONE_DAY; } /* Reset the clock to 00:00. */ public void reset() { if (debug) System.out.println("RESET!"); minutes = 0; } /* Draw the clock or fixation point. */ public void paintComponent (Graphics g) { super.paintComponent (g); if (showClock == true) { paintClock(g); } else { paintFixationPoint(g); } //just ensure that java knows we want to draw new things revalidate(); } private void paintFixationPoint(Graphics g) { //System.out.println("paintFixationPoint"); int left_edge = BORDER; int top = BORDER; int diameter = WIDTH - (BORDER * 2); int centrex = left_edge + (diameter / 2); int centrey = top + (diameter / 2); int linelength = diameter / 20; g.setColor(FOREGROUND); g.drawLine(centrey, centrex - linelength, centrey, centrex + linelength); g.drawLine(centrey - linelength, centrex, centrey + linelength, centrex); } private void paintClock (Graphics g) { //System.out.println("paintClock"); int minutes_angle = 90 - ((minutes % 60) * 6); int hours_angle = 90 - ((minutes / 60) * 30); int left_edge = BORDER; int top = BORDER; int diameter = WIDTH - (BORDER * 2); int radius = diameter / 2; int centrex = left_edge + radius; int centrey = top + radius; g.setColor(FOREGROUND); // draw the clock as a black circle: g.drawOval(left_edge, top, diameter, diameter); // draw the hour numbers int offset = 0; for(int i = 1; i <= 12; i++) { int hours_pos = 90 - (i * 30); int x = (centrex - offset) + (int)((radius - 5) * Math.cos(hours_pos * Math.PI / 180)); int y = (centrey + offset) - (int)((radius - 5) * Math.sin(hours_pos * Math.PI / 180)); //g.drawString(String.valueOf(i), x, y); g.drawOval(x, y, diameter / 200, diameter / 200); } // get the coordinate of the line_ends int minutesx = (int)((radius - 5) * Math.cos(minutes_angle * Math.PI / 180)); int minutesy = (int)((radius - 5) * Math.sin(minutes_angle * Math.PI /180)); // draw the minutes' hand g.drawLine(centrex, centrey, centrex + minutesx, centrey - minutesy); int arc_angle = minutes_angle - 90; Graphics2D g2 = (Graphics2D)g; g2.setPaint(FOREGROUND); if (debug) System.out.println("minutes_angle = " + minutes_angle + "; arc_angle = " + arc_angle); if (arc_angle == 0 & showFullClock == true) { g2.fillOval(left_edge, top, diameter, diameter); showFullClock = false; } else { showFullClock = true; if (arc_angle >= -180) { Arc2D pie = new Arc2D.Float(centrex - radius, centrey - radius, 2 * radius, 2 * radius, 90, arc_angle, Arc2D.PIE); g2.fill(pie); } else { Arc2D pie1 = new Arc2D.Float(centrex - radius, centrey - radius, 2 * radius, 2 * radius, 90, -180, Arc2D.PIE); Arc2D pie2 = new Arc2D.Float(centrex - radius, centrey - radius, 2 * radius, 2 * radius, 270, arc_angle + 180, Arc2D.PIE); g2.fill(pie1); g2.fill(pie2); } } } }