【综合练习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);
}
}