import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import java.util.Calendar;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.Timer;
public class ClockTest {
public static void main(String[] args) {
ClockFrame cf = new ClockFrame();
cf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
cf.setVisible(true);
}
}
class ClockFrame extends JFrame {
private static final long serialVersionUID = 1L;
private ClockPanel panel;
private Calendar calendar;
public ClockFrame() {
setTitle("Clock");
setResizable(false);
Toolkit kit = Toolkit.getDefaultToolkit();
Dimension screen = kit.getScreenSize();
int screenX = screen.width;
int screenY = screen.height;
setLocation(screenX / 3,screenY / 3);
ActionListener listener = new ActionListener(){
public void actionPerformed(ActionEvent e) {
calendar = getClock();
String h = String.valueOf(calendar.get(Calendar.HOUR_OF_DAY));
String m = String.valueOf(calendar.get(Calendar.MINUTE));
String s = String.valueOf(calendar.get(Calendar.SECOND));
TextPanel tp = new TextPanel(h,m,s);
add(tp,BorderLayout.NORTH);
panel = new ClockPanel(h,m,s);
add(panel,BorderLayout.CENTER);
pack();
}
};
new Timer(1000,listener).start();
}
public Calendar getClock() {
Calendar calendar = Calendar.getInstance();
return calendar;
}
}
class TextPanel extends JPanel {
private static final long serialVersionUID = 1L;
private JTextField hourField;
private JTextField minuteField;
private JTextField secondField;
public TextPanel(String h,String m,String s) {
setBackground(Color.WHITE);
add(new JLabel("Hour:"));
hourField = new JTextField(h,3);
hourField.setEditable(false);
add(hourField);
add(new JLabel("Minute:"));
minuteField = new JTextField(m,3);
minuteField.setEditable(false);
add(minuteField);
add(new JLabel("Second:"));
secondField = new JTextField(s,3);
secondField.setEditable(false);
add(secondField);
}
}
class ClockPanel extends JPanel {
private static final long serialVersionUID = 1L;
private double seconds = 0;
private double minutes = 0;
private double hours = 0;
private int RADIUS = 100;
private double SECOND_HAND_LENGTH = 0.8 * RADIUS;
private double MINUTE_HAND_LENGTH = 0.8 * RADIUS;
private double HOUR_HAND_LENGTH = 0.7 * RADIUS;
private int centerX = 0;
private int centerY = 0;
public ClockPanel(String h,String m,String s) {
setBackground(Color.BLACK);
hours = Double.parseDouble(h);
minutes = Double.parseDouble(m);
seconds = Double.parseDouble(s);
setPreferredSize(new Dimension(2 * RADIUS + 100,2 * RADIUS + 100));
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D gs = (Graphics2D)g;
centerX = this.getWidth() / 2;
centerY = this.getHeight() / 2;
gs.setColor(Color.GREEN);
gs.drawString("MAN 表", centerX - 20, centerY - RADIUS / 2);
gs.drawString("MADE IN CHINA", centerX - 40, centerY + RADIUS / 2);
gs.setColor(Color.WHITE);
for(double nlLoop = 0; nlLoop <= 2; nlLoop = nlLoop + 0.1) {
Ellipse2D circle = new Ellipse2D.Double(
centerX - RADIUS + 15 + nlLoop,
centerY - RADIUS + 15 + nlLoop,
2 * (RADIUS - 15),
2 * (RADIUS - 15));
gs.draw(circle);
}
for(double nlLoop = 0; nlLoop <= 2; nlLoop = nlLoop + 0.1) {
Ellipse2D circle = new Ellipse2D.Double(
centerX - RADIUS - 9 + nlLoop,
centerY - RADIUS - 9 + nlLoop,
2 * (RADIUS + 9),
2 * (RADIUS + 9));
gs.draw(circle);
}
String[] timer = {"Ⅰ","Ⅱ","Ⅲ","Ⅳ","Ⅴ","Ⅵ","Ⅶ","Ⅷ","Ⅸ","Ⅹ","Ⅺ","Ⅻ"};
gs.setColor(Color.RED);
int gX = centerX - 3;
int gY = centerY - RADIUS + 5;
for(int i = 0; i < 12; i ++) {
int x = (int) (gX + RADIUS * Math.sin(2 * Math.PI * (i + 1) / 12));
int y = (int) (gY + RADIUS * (1.0 - Math.cos(2 * Math.PI * (i + 1) / 12)));
gs.drawString(timer[i], x, y);
}
double secondAngle = Math.toRadians(360 * seconds / 60);
drawHand(gs,secondAngle,SECOND_HAND_LENGTH,"s");
double minuteAngle = Math.toRadians(360 * (minutes + seconds / 60) / 60);
drawHand(gs,minuteAngle,MINUTE_HAND_LENGTH,"m");
double hourAngle = Math.toRadians(360 * (hours - 12) / 12 + 360 * minutes / (60 * 12));
drawHand(gs,hourAngle,HOUR_HAND_LENGTH,"h");
}
private void drawHand(Graphics2D gc,double angle,double hand,String l) {
Point2D center = new Point2D.Double(centerX,centerY);
Point2D end = new Point2D.Double(
centerX + hand * Math.sin(angle),
centerY - hand * Math.cos(angle));
if(l.equals("h")) {
gc.setColor(Color.RED);
} else if(l.equals("m")) {
gc.setColor(Color.green);
} else if(l.equals("s")) {
gc.setColor(Color.BLUE);
}
gc.draw(new Line2D.Double(center,end));
}
}