【综合练习3】石英钟

【综合练习3】石英钟
绘制一个石英钟,秒针、分针和时针会随着时间发生位置变化

  • ClockFrame
package draw;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class ClockFrame extends JDialog{
	
	private Point p_initialize;
	
	public ClockFrame() {
		setTitle("石英钟");
		setDefaultCloseOperation(HIDE_ON_CLOSE);
		setBounds(100, 30, 300, 300);
		
		addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(final KeyEvent e) {
				int code = e.getKeyCode();
				if(code == KeyEvent.VK_X && e.getModifiersEx() == (KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)) {
					System.exit(0);
				}
			}
		});
			
		ClockPanel clockPanel = new ClockPanel();
		getContentPane().add(clockPanel);
		clockPanel.addMouseListener(new MouseAdapter() {
			@Override
			public void mousePressed(final MouseEvent e) {
				if(e.getButton() == MouseEvent.BUTTON3) {
					System.exit(0);
				}
			}
		});
		
		
		new Thread() {
			@Override
			public void run() {
				while(true) {
					try {
						sleep(1000);
						clockPanel.repaint();
					}catch(InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		}.start();

	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		EventQueue.invokeLater(new Runnable() {
			@Override
			public void run() {
				try {
					ClockFrame f = new ClockFrame();
					f.setVisible(true);
				}catch(Exception e){
					e.printStackTrace();
				}
			}
			
		});
	}

}

  • ClockPanel
package draw;


import javax.swing.JPanel;
import javax.swing.ImageIcon;

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.BasicStroke;
import java.awt.Dimension;

import java.util.Calendar;

import java.lang.Runtime;

import static java.util.Calendar.HOUR;
import static java.util.Calendar.MINUTE;
import static java.util.Calendar.SECOND;
import static java.util.Calendar.MILLISECOND;

public class ClockPanel extends JPanel {
	private static final BasicStroke HOURS_POINT_WIDTH = new BasicStroke(4);
	private static final BasicStroke MINUTES_POINT_WIDTH = new BasicStroke(3);
	private static final BasicStroke SECONDS_POINT_WIDTH = new BasicStroke(4);
	
	ImageIcon background;
	
	private int centerX;
	private int centerY;
	
	private final static int secLen = 60;
	private final static int minutesLen = 55;
	private final static int hourLen = 36;
	
	public ClockPanel() {
		setToolTipText("小键盘+、-调整透明度,Ctrl+Shift+X退出");
		setOpaque(false);
		background = new ImageIcon(getClass().getResource("clock.jpg"));
		
		int iconWidth = background.getIconWidth();
		centerX = iconWidth / 2;
		int iconHeight = background.getIconHeight();
		centerY = iconHeight / 2;
		
		setPreferredSize(new Dimension(iconWidth, iconHeight));
		
//		javax.swing.JLabel label = new javax.swing.JLabel(background);
//		add(label);
		
	}
	
	@Override
	public void paint(Graphics g) {
		Graphics2D g2 = (Graphics2D)g;
		g2.drawImage(background.getImage(),0,0,this);
		
		Calendar calendar = Calendar.getInstance();	// 获得实例对象
		int millisecond = calendar.get(MILLISECOND);
		int sec = calendar.get(SECOND);
		int minutes = calendar.get(MINUTE);
		int hours = calendar.get(HOUR); 
		
		double secAngle = (60 - sec) * 6 - (millisecond/150);
		int minutesAngle = (60 - minutes) * 6;
		int hoursAngle = (12 - hours) * 360 / 12 - (minutes / 2);
		
		// 秒针、分针、时针距离中心点的横纵长度
		int secX = (int)(secLen * Math.sin(Math.toRadians(secAngle)));
		int secY = (int)(secLen * Math.cos(Math.toRadians(secAngle)));
		int minutesX = (int)(minutesLen * Math.sin(Math.toRadians(minutesAngle)));
		int minutesY = (int)(minutesLen * Math.cos(Math.toRadians(minutesAngle)));
		int hoursX = (int)(hourLen * Math.sin(Math.toRadians(hoursAngle)));
		int hoursY = (int)(hourLen * Math.cos(Math.toRadians(hoursAngle)));
		
		g2.setStroke(HOURS_POINT_WIDTH);
		g2.setColor(Color.BLACK);
		g2.drawLine(centerX, centerY, centerX - hoursX, centerY - hoursY);
		
		g2.setStroke(MINUTES_POINT_WIDTH);
		if(minutesAngle != hoursAngle) 
			g2.setColor(new Color(0x2F2F2F));
		else
			g2.setColor(Color.GREEN);
		g2.drawLine(centerX, centerY, centerX - minutesX, centerY - minutesY);

		//绘制两个秒针
		g2.setStroke(SECONDS_POINT_WIDTH);
		if(secAngle != hoursAngle && secAngle != minutesAngle)
			g2.setColor(Color.ORANGE);
		else {
			g2.setColor(Color.GREEN);
		}
		g2.drawLine(centerX, centerY, centerX - secX, centerY - secY);
		g2.drawLine(centerX + 1, centerY + 1, centerX - secX + 1, centerY - secY + 1);
		
		g2.fillOval(centerX - 5, centerY - 5, 10, 10);
	}
	
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new ClockPanel().setVisible(true);
	}

}

在这里插入图片描述

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值