Java Graphical User Interfaces (GUIs)

A clock example (author unknown).


import javax.swing.JFrame;

public class ClockGUI {
	public static void main(String[] args) {
		ClockDrawingFrame frame = new ClockDrawingFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
}


import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

/**
 * A frame with two text fields to set a clock.
 */
public class ClockDrawingFrame extends JFrame {
	private JTextField hourField;
	private JTextField minuteField;
	private ClockPanel clock;

	public ClockDrawingFrame() {
		setTitle("Clock GUI");

		DocumentListener listener = new ClockFieldListener();

		// add a panel with text fields (label)

		JPanel panel = new JPanel();

		panel.add(new JLabel("Hours:"));
		hourField = new JTextField("12", 3);
		panel.add(hourField);
		hourField.getDocument().addDocumentListener(listener);

		panel.add(new JLabel("Minutes:"));
		minuteField = new JTextField("00", 3);
		panel.add(minuteField);
		minuteField.getDocument().addDocumentListener(listener);

		add(panel, BorderLayout.SOUTH);

		// add the clock

		clock = new ClockPanel();
		add(clock, BorderLayout.CENTER);
		pack();
	}

	/**
	 * Set the clock to the values stored in the text fields.
	 */
	public void setClock() {
		try {
			int hours = Integer.parseInt(hourField.getText().trim());
			int minutes = Integer.parseInt(minuteField.getText().trim());
			clock.setTime(hours, minutes);
		} catch (NumberFormatException e) {
		}
		// don't set the clock if the input can't be parsed
	}

	private class ClockFieldListener implements DocumentListener {
		public void insertUpdate(DocumentEvent event) {
			setClock();
		}

		public void removeUpdate(DocumentEvent event) {
			setClock();
		}

		public void changedUpdate(DocumentEvent event) {
		}
	}
}


import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;

import javax.swing.JPanel;

/**
 * A panel that draws a clock.
 */
public class ClockPanel extends JPanel {
	private double minutes = 0;
	private int RADIUS = 100;
	private double MINUTE_HAND_LENGTH = 0.8 * RADIUS;
	private double HOUR_HAND_LENGTH = 0.6 * RADIUS;
	
	public ClockPanel() {
		setPreferredSize(new Dimension(2 * RADIUS + 1, 2 * RADIUS + 1));
	}

	public void paintComponent(Graphics g) {
		// draw the circular boundary

		super.paintComponent(g);
		Graphics2D g2 = (Graphics2D) g;
		Ellipse2D circle = new Ellipse2D.Double(0, 0, 2 * RADIUS, 2 * RADIUS);
		g2.draw(circle);

		// draw the hour hand

		double hourAngle = Math.toRadians(90 - 360 * minutes / (12 * 60));
		drawHand(g2, hourAngle, HOUR_HAND_LENGTH);

		// draw the minute hand

		double minuteAngle = Math.toRadians(90 - 360 * minutes / 60);
		drawHand(g2, minuteAngle, MINUTE_HAND_LENGTH);
	}

	public void drawHand(Graphics2D g2, double angle, double handLength) {
		Point2D end = new Point2D.Double(RADIUS + handLength * Math.cos(angle),
				RADIUS - handLength * Math.sin(angle));
		Point2D center = new Point2D.Double(RADIUS, RADIUS);
		g2.draw(new Line2D.Double(center, end));
	}

	/**
	 * Set the time to be displayed on the clock
	 * 
	 * @param h hours
	 * @param m minutes
	 */
	public void setTime(int h, int m) {
		minutes = h * 60 + m;
		repaint();
	}


}

CSci 2101 course web site.