view Clock.java @ 45:351b0c8b34ac

Fixed issue where error message was shown every time the user chose to move continue using the keyboard. Fixed issue where data wasn't saving to file after questionaire. Changed SubjectData output filename to "<Participant ID>_qu.dat" (previously was "subjects.dat". Would have been overwritten as wasn't dynamic.
author Carl Bussey <c.bussey@se10.qmul.ac.uk>
date Sun, 09 Jun 2013 22:06:52 +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);
            }
        }
    }
}