📄 clockcanvas.java
字号:
import java.awt.*;
import javax.swing.*;
import java.util.*;
import java.util.Timer;
import java.util.Random;
import java.awt.event.*;
import java.awt.event.MouseMotionListener;
class ClockCanvas extends JPanel //clockcanvas
{
static int seconds = 0;
private final int wild=600,length=600;
private int cx=160,cy=65,cr=60,hr=(int)(cr/3+10),mr=hr+10,sr=mr+15;
private int dx=0,dy=0;
private Timer timer;
private Random Creator;
private String c=new String("北京时间:"),tz=new String("GMT+8");
private String time;
private int h,m,s;
private GregorianCalendar calendar;
private Color scolor=Color.black;
public JButton magify,dwindle;
private JLabel label;
//构造函数
public ClockCanvas()
{
Creator=new Random();
calendar = new GregorianCalendar(TimeZone.getTimeZone(tz));
//在具有默认语言环境的给定时区内构造一个基于当前时间的 GregorianCalendar。
//GregorianCalendar类只是程序开始的时间,不会向后数。
h=calendar.get(Calendar.HOUR);
m=calendar.get(Calendar.MINUTE);
s=calendar.get(Calendar.SECOND);
time=new String(c+h+':'+m+':'+s);/**/
seconds = h* 60 * 60+ m* 60+ s;
timer = new Timer(); //计时器
timer.schedule(new MyTask(),1,1000);
magify=new JButton("放大");//设置按钮,,,标签
dwindle=new JButton("缩小");
label=new JLabel(time);
ButtonListener listener=new ButtonListener();
magify.addActionListener(listener);
dwindle.addActionListener(listener);
setLayout(new GridLayout(0,1));//布局管理器
setBorder(BorderFactory.createEmptyBorder(0,wild,0,0));
add(magify);
add(dwindle);
add(label);
//addMouseMotionListener(new DotsListemer()); 想做到鼠标拖动的效果,但不行
addMouseListener(new DotsListemer());
setPreferredSize(new Dimension(wild+100,length));
setBackground(Color.cyan);
}
//绘制钟面
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setColor(scolor);
g.drawOval(cx-cr,cy-cr, 2*cr, 2*cr);
g.drawOval(cx-cr+1,cy-cr+1, 2*(cr-1), 2*(cr-1));
g.drawLine(cx,cy-cr,cx,cy-sr);
g.drawLine(cx+cr,cy,cx+sr,cy);
g.drawLine(cx,cy+cr,cx,cy+sr);
g.drawLine(cx-cr,cy,cx-sr,cy);
//分离时间
//时针和分针都是根据秒数决定角度
double hourAngle = 2 * Math.PI
* (seconds - 3 * 60 * 60) / (12 * 60 * 60);
double minuteAngle = 2 * Math.PI
* (seconds - 15 * 60) / (60 * 60);
double secondAngle = 2 * Math.PI
* (seconds - 15) / 60;
g.drawLine(cx, cy-1, cx + (int)(hr* Math.cos(hourAngle)), //hour -1
cy-1 + (int)(hr * Math.sin(hourAngle)));
g.drawLine(cx, cy, cx + (int)(hr* Math.cos(hourAngle)),// hour 0
cy + (int)(hr * Math.sin(hourAngle)));
g.drawLine(cx, cy+1, cx + (int)(hr* Math.cos(hourAngle)), //hour +1
cy+1 + (int)(hr * Math.sin(hourAngle)));
g.drawLine(cx, cy-2, cx + (int)(hr* Math.cos(hourAngle)), //hour -2
cy-2 + (int)(hr * Math.sin(hourAngle)));
g.drawLine(cx, cy+2, cx + (int)(hr* Math.cos(hourAngle)), //hour +2
cy+2 + (int)(hr * Math.sin(hourAngle)));
g.drawLine(cx, cy, cx + (int)(mr* Math.cos(minuteAngle)),//minute 0
cy + (int)(mr * Math.sin(minuteAngle)));
g.drawLine(cx, cy-1, cx + (int)(mr* Math.cos(minuteAngle)), //minute -1
cy-1 + (int)(mr * Math.sin(minuteAngle)));
g.drawLine(cx, cy, cx + (int)(sr* Math.cos(secondAngle)), //second
cy + (int)(sr * Math.sin(secondAngle)));
g.drawLine(0,length,wild,length);//画边界
g.drawLine(wild,0,wild,length);
label.setText(time);
}
public class MyTask extends java.util.TimerTask
{
public void run()
{
seconds++;
cx+=Creator.nextInt(5)+dx;
cy+=Creator.nextInt(5)+dy;
if(cx<=cr){cx=cr;dx=0;}
else if(cx>=wild-cr){cx=wild-cr;dx=-5;}
if(cy<=cr){cy=cr;dy=0;}
else if(cy>=length-cr){cy=length-cr;dy=-5;}
s++;
if (s==60)
{
m++;
s=0;
}
if (m==60)
{
h++;
m=0;
}
if (h==24)
{
h=0;
}
time=new String(c+h+':'+m+':'+s);
repaint();
}
}
private class DotsListemer implements java.awt.event.MouseListener
{
public Point dot;
public double dst;
public void mousePressed(MouseEvent e)
{
dot=e.getPoint();
if((dot.x<=wild-cr&&dot.x>=cr)&&(dot.y<=length-cr&&dot.y>=cr))
{
cx=dot.x;
cy=dot.y;
scolor=Color.green;
repaint();
}
}
public void mouseClicked (MouseEvent e){}
public void mouseReleased (MouseEvent e)
{scolor=Color.red;repaint();}
public void mouseEntered (MouseEvent e)
{
scolor=Color.pink;repaint();
}
public void mouseExited (MouseEvent e)
{
scolor=Color.black;repaint();
}
}
private class ButtonListener implements ActionListener//Button事件
{
public void actionPerformed(ActionEvent event)
{
if(event.getSource()==magify)
{
cr*=2;
if(cr>=(wild+length/4))cr=150;
hr=(int)(cr/3+10);mr=hr+10;sr=mr+15;
}
else if(event.getSource()==dwindle)
{
cr=(int)(cr/2);
if(cr<=2)cr=2;
hr=(int)(cr/3+10);mr=hr+10;sr=mr+15;
}
repaint();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -