自己编写的Java Swing 时钟 比较繁琐 请指教

来源:互联网 发布:python 性能测试脚本 编辑:程序博客网 时间:2024/05/22 12:56

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));
 }
 
}