1、运行结果
2、源代码如下:
package demo.others;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.TimerTask;
import javax.swing.*;
/**
* 时钟类
*/
public class Clock extends JFrame {
// 画时钟的面板
private paintPanel clock = new paintPanel();
// 定时器
private java.util.Timer timer = new java.util.Timer();
// 显示时间的label
JLabel messageLabel = new JLabel("", SwingConstants.CENTER);
public Clock() {
setTitle("时钟");
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// this.setLocationRelativeTo(null);
this.setSize(400, 400);
add(clock);
messageLabel.setForeground(Color.RED);
messageLabel.setFont(new Font("Courier", Font.BOLD, 18));
add(messageLabel, BorderLayout.SOUTH);
// 定时器执行任务
timer.schedule(new TimerTask() {
@Override
public void run() {
clock.setCurrentTime();// 设置为当前时间
messageLabel.setText(clock.getHour() + ":" + clock.getMinute() + ":" + clock.getSecond() + '\n');
repaint();
}
}, 0, 1000);
}
public static void main(String[] args) {
new Clock();
}
private class paintPanel extends JPanel {
private int hour, minute, second;
public paintPanel() {
setCurrentTime();
}
// 设置时钟为当前时间
private void setCurrentTime() {
Calendar calendar = new GregorianCalendar();
hour = calendar.get(Calendar.HOUR_OF_DAY);
minute = calendar.get(Calendar.MINUTE);
second = calendar.get(Calendar.SECOND);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
int xCenter = getWidth() / 2;
int yCenter = getHeight() / 2;
// 计算半径
int radius = (int) (Math.min(this.getWidth(), this.getHeight()) * 0.8 * 0.5);
// 画圆
g.drawOval(xCenter - radius, yCenter - radius, radius * 2, radius * 2);
// 画钟面上显示的数字
g.drawString("12", xCenter - 6, yCenter - radius + 12);
g.drawString("3", xCenter + radius - 12, yCenter + 4);
g.drawString("6", xCenter - 4, yCenter + radius - 8);
g.drawString("9", xCenter - radius + 4, yCenter + 6);
// 画时针、分针、秒针
g.drawLine(xCenter, yCenter, (int) (xCenter + radius * 0.8 * Math.sin(second * 2 * Math.PI / 60)), (int) (yCenter - radius * 0.8 * Math.cos(second * 2 * Math.PI / 60)));
g.drawLine(xCenter, yCenter, (int) (xCenter + radius * 0.6 * Math.sin(minute * 2 * Math.PI / 60)), (int) (yCenter - radius * 0.6 * Math.cos(minute * 2 * Math.PI / 60)));
g.drawLine(xCenter, yCenter, (int) (xCenter + radius * 0.4 * Math.sin((hour + minute / 60.0) * 2 * Math.PI / 12)), (int) (yCenter - radius * 0.4
* Math.cos((hour + minute / 60.0) * 2 * Math.PI / 12)));
}
public int getHour() {
return hour;
}
public int getMinute() {
return minute;
}
public int getSecond() {
return second;
}
}
}