时钟类---swing画图、Timer、JFrame用法示例

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


 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值