失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > java表盘时钟的设计思路_java代码实现时钟

java表盘时钟的设计思路_java代码实现时钟

时间:2019-05-24 11:32:15

相关推荐

java表盘时钟的设计思路_java代码实现时钟

实现效果如图:

Java代码:

文件一:ClockPanel.java

importstaticjava.util.Calendar.HOUR;importstaticjava.util.Calendar.MILLISECOND;importstaticjava.util.Calendar.MINUTE;importstaticjava.util.Calendar.SECOND;importjava.awt.BasicStroke;importjava.awt.Color;importjava.awt.Dimension;importjava.awt.Graphics;importjava.awt.Graphics2D;importjava.util.Calendar;importjavax.swing.ImageIcon;importjavax.swing.JPanel;/**

* 时钟面板

*

* @author 听说你很会玩

*/@SuppressWarnings("serial")publicclassClockPanelextendsJPanel{// 3个指针的粗细privatestaticfinalBasicStroke HOURS_POINT_WIDTH=newBasicStroke(4);privatestaticfinalBasicStroke MINUETES_POINT_WIDTH=newBasicStroke(3);privatestaticfinalBasicStroke SEC_POINT_WIDTH=newBasicStroke(2);ImageIcon background;// 背景图片对象privateintcenterX;// 中心坐标privateintcenterY;// 中心坐标privatefinalstaticintsecLen=60;// 指针长度privatefinalstaticintminuesLen=55;// 指针长度privatefinalstaticinthoursLen=36;// 指针长度/**

* 构造方法

*/publicClockPanel(){setToolTipText("小键盘+、-调整透明度,Crtl+Shift+X退出");// 提示信息setOpaque(false);background=newImageIcon(getClass().getResource("clock.jpg"));// 加载图片inticonWidth=background.getIconWidth();// 获取图片大小centerX=iconWidth/2;// 获取图片中间坐标inticonHeight=background.getIconHeight();centerY=iconHeight/2;// 获取图片中间坐标setPreferredSize(newDimension(iconWidth,iconHeight));}@Overridepublicvoidpaint(Graphics g){// 重写父类方法Graphics2D g2=(Graphics2D)g;g2.drawImage(background.getImage(),0,0,this);// 绘制背景图片Calendar calendar=Calendar.getInstance();// 获取日历对象intmillisecond=calendar.get(MILLISECOND);// 获取毫秒值intsec=calendar.get(SECOND);// 获取秒值intminutes=calendar.get(MINUTE);// 获取分值inthours=calendar.get(HOUR);// 获取时值doublesecAngle=(60-sec)*6-(millisecond/150);// 秒针角度intminutesAngle=(60-minutes)*6;// 分针角度inthoursAngle=(12-hours)*360/12-(minutes/2);// 时针角度// 计算秒针、分针、时针指向的坐标intsecX=(int)(secLen*Math.sin(Math.toRadians(secAngle)));// 秒针指向点的X坐标intsecY=(int)(secLen*Math.cos(Math.toRadians(secAngle)));// 秒针指向点的Y坐标intminutesX=(int)(minuesLen*Math.sin(Math.toRadians(minutesAngle)));// 分针指向点的X坐标intminutesY=(int)(minuesLen*Math.cos(Math.toRadians(minutesAngle)));// 分针指向点的Y坐标inthoursX=(int)(hoursLen*Math.sin(Math.toRadians(hoursAngle)));// 时针指向点的X坐标inthoursY=(int)(hoursLen*Math.cos(Math.toRadians(hoursAngle)));// 时针指向点的Y坐标// 分别绘制时针、分针、秒针g2.setStroke(HOURS_POINT_WIDTH);// 设置时针的宽度g2.setColor(Color.BLACK);// 设置时针的颜色g2.drawLine(centerX,centerY,centerX-hoursX,centerY-hoursY);// 绘制时针g2.setStroke(MINUETES_POINT_WIDTH);// 设置分针的宽度if(minutesAngle!=hoursAngle)// 分针、时针重叠变色g2.setColor(newColor(0x2F2F2F));// 设置未重叠时的颜色else{g2.setColor(Color.GREEN);// 设置重叠时的颜色}g2.drawLine(centerX,centerY,centerX-minutesX,centerY-minutesY);// 绘制分针g2.setStroke(SEC_POINT_WIDTH);// 设置秒针的宽度if(secAngle!=hoursAngle&&secAngle!=minutesAngle)// 分针、时针、秒针重叠变色g2.setColor(Color.ORANGE);// 设置未重叠时的颜色else{g2.setColor(Color.GREEN);// 设置重叠时的颜色}// 绘制3个指针的中心圆和秒针g2.fillOval(centerX-5,centerY-5,10,10);// 绘制中心圆g2.drawLine(centerX,centerY,centerX-secX,centerY-secY);// 绘制秒针g2.drawLine(centerX+1,centerY+1,centerX-secX+1,centerY-secY+1);// 绘制秒针}}

文件二:ClockFrame.java

importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;/**

* @author 张振坤

*/@SuppressWarnings("serial")publicclassClockFrameextendsJDialog{privatefloatopqua=0.7f;privateClockPanel clockPanel;privatePoint fp;// 拖曳窗体之前的鼠标位置publicstaticvoidmain(String args[]){EventQueue.invokeLater(newRunnable(){publicvoidrun(){try{ClockFrame frame=newClockFrame();// 创建窗体对象frame.setVisible(true);// 显示窗体}catch(Exceptione){e.printStackTrace();}}});}/**

* 布局窗体的构造方法

*/publicClockFrame(){super();setUndecorated(true);// 取消窗体修饰setAlwaysOnTop(true);// 窗体置顶setTitle("石英钟");// 设置窗体标题getContentPane().setLayout(newBorderLayout());setBounds(100,30,217,257);setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);clockPanel=newClockPanel();// 创建时钟面板getContentPane().add(clockPanel);// 为时钟面板添加鼠标按键事件监听器clockPanel.addMouseListener(newMouseAdapter(){publicvoidmousePressed(finalMouseEvent e){fp=e.getPoint();if(e.getButton()==MouseEvent.BUTTON3){System.exit(0);// 右键退出}}});// 在时钟面板的鼠标拖曳事件中移动窗体clockPanel.addMouseMotionListener(newMouseMotionAdapter(){publicvoidmouseDragged(finalMouseEvent e){JDialog frame=(JDialog)getRootPane().getParent();Point point=e.getLocationOnScreen();frame.setLocation(point.x-fp.x,point.y-fp.y);}});pack();addKeyListener(newKeyAdapter(){// 为窗体添加键盘事件监听器publicvoidkeyPressed(finalKeyEvent e){intcode=e.getKeyCode();switch(code){// 判断按键编码caseKeyEvent.VK_ADD://+符号按键会降低透明图 opqua+=0.05;opqua=opqua>0.95f?1f:opqua;break;caseKeyEvent.VK_SUBTRACT://-符号按键会提升透明度 opqua-=0.05;opqua=opqua<0.1f?0.1f:opqua;break;}// 如果按Ctrl+Shift+X組合鍵,将退出程序if(code==KeyEvent.VK_X&&e.getModifiersEx()==(KeyEvent.CTRL_DOWN_MASK|KeyEvent.SHIFT_DOWN_MASK))System.exit(0);}});Dimension screenSize=getToolkit().getScreenSize();doublewidth=screenSize.getWidth();intx=(int)(width-getWidth()-30);setLocation(x,30);newThread(){// 创建线程对象,更新时钟面板界面@Overridepublicvoidrun(){try{while(true){sleep(1000);// 休眠1秒clockPanel.repaint();// 重新绘制时钟面板界面}}catch(InterruptedExceptione){e.printStackTrace();}}}.start();}}

两个Java文件就实现了!!Java是不是很牛逼!!哈哈。接下来讲解一下实现步骤:

把上面的代码赋值下来并把它粘贴到记事本保存,两个文件放在同一个文件加里,改一下文件后缀为Java。

配置Java环境就是下载JDK,这个步骤不懂的自行百度

cmd执行编译命令javac(注意:只编译ClockFrame.java文件,ClockPanel.java不编译,因为它在编译ClockFrame.java文件时,也会编译ClockPanel.java文件)

执行Java命令(效果如图)

欧克,这个实现功能就到此结束了。

如果觉得《java表盘时钟的设计思路_java代码实现时钟》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。