import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.geom.*;
import java.awt.event.*;
public class TextTest{
public static void main(String args[]){
TextTestFrame frame = new TextTestFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.show();
}
}
class TextTestFrame extends JFrame{
public TextTestFrame(){
setTitle("TextTest");
setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
Container contentPane = getContentPane();
DocumentListener listener = new ClockFieldListener();
JPanel panel = new JPanel();
hourField = new JTextField("12",3);
panel.add(hourField);
hourField.getDocument().addDocumentListener(listener);
minuteField = new JTextField("0",3);
panel.add(minuteField);
hourField.getDocument().addDocumentListener(listener);
contentPane.add(panel,BorderLayout.SOUTH);
clock = new ClockPanel();
contentPane.add(clock,BorderLayout.CENTER);
}
public void setClock(){
try{
int hours = Integer.parseInt(hourField.getText().trim());
int minutes = Integer.parseInt(hourField.getText().trim());
clock.setTime(hours,minutes);
}
catch(NumberFormatException e){}
}
private static int DEFAULT_WIDTH = 300;
private static int DEFAULT_HEIGHT =200;
private JTextField hourField;
private JTextField minuteField;
private ClockPanel clock;
private class ClockFieldListener implements DocumentListener{
public void insertUpdate(DocumentEvent e) { setClock(); }
public void removeUpdate(DocumentEvent e) { setClock(); }
public void changedUpdate(DocumentEvent e) { }
}
}
class ClockPanel extends JPanel{
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
Ellipse2D circle = new Ellipse2D.Double(0,0,2 * RADIUS, 2 * RADIUS);
g2.draw(circle);
double hourAngle = Math.toRadians(90 - 360 * minutes / (12 * 60));
drawHand(g2,hourAngle,HOUR_HAND_LENGTH);
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));
}
public void setTime(int h, int m){
minutes = h * 60 + m;
repaint();
}
private double minutes = 0;
private double RADIUS = 100;
private double MINUTE_HAND_LENGTH = 0.8 * RADIUS;
private double HOUR_HAND_LENGTH = 0.6 * RADIUS;
}