JavaFX实现简易时钟效果(二)
本文实例为大家分享了JavaFX实现简易时钟效果的具体代码,供大家参考,具体内容如下
在前一篇博客中,我们已经绘制了一个静止时钟。
绘制简易时钟(一)
首先进行一个微调:让表盘根据窗口大小自动调整大小:
在ShowClock.start()中,添加对面板长宽的监听。
pane.widthProperty().addListener(ov->clock.setW(pane.getWidth())); pane.heightProperty().addListener(ov->clock.setH(pane.getHeight()));
添加对时间和钟表大小的更改方法
在ClockPane类中添加:
/**Constructaclockwithspecifiedhour,minute,andsecond*/ publicClockPane(inthour,intminute,intsecond){ this.hour=hour; this.minute=minute; this.second=second; paintClock(); } /**Setanewhour*/ publicvoidsetHour(inthour){ this.hour=hour; paintClock(); } /**Setanewminute*/ publicvoidsetMinute(intminute){ this.minute=minute; paintClock(); } /**Setanewsecond*/ publicvoidsetSecond(intsecond){ this.second=second; paintClock(); } /**Returnclockpane'swidth*/ publicdoublegetW(){ returnw; } /**Setclockpane'swidth*/ publicvoidsetW(doublew){ this.w=w; paintClock(); } /**Returnclockpane'sheight*/ publicdoublegetH(){ returnh; } /**Setclockpane'sheight*/ publicvoidsetH(doubleh){ this.h=h; paintClock(); }
用Timeline实现动态钟表
在ShowClock类中添加:
//设置事件处理对象 EventHandlereventHandler=e->{ clock.setCurrentTime(); }; //每秒结束后触发eventHandler Timelineanimation=newTimeline( newKeyFrame(Duration.millis(1000),eventHandler)); animation.setCycleCount(Timeline.INDEFINITE);//无限循环 animation.play();//开始动画
就可以让时钟动起来了。
完整代码
ShowClock.java
packageprimier; importjavafx.application.Application; importjavafx.geometry.Pos; importjavafx.scene.Scene; importjavafx.stage.Stage; importjavafx.scene.layout.*; importjavafx.scene.control.*; importjavafx.event.ActionEvent; importjavafx.event.EventHandler; importjavafx.util.Duration; importjavafx.animation.KeyFrame; importjavafx.animation.Timeline; publicclassShowClockextendsApplication{ @Override//OverridethestartmethodintheApplicationclass publicvoidstart(StageprimaryStage){ ClockPaneclock=newClockPane(); //设置事件处理对象 EventHandlereventHandler=e->{ clock.setCurrentTime(); }; //每秒结束后触发eventHandler Timelineanimation=newTimeline( newKeyFrame(Duration.millis(1000),eventHandler)); animation.setCycleCount(Timeline.INDEFINITE);//无限循环 animation.play();//开始动画 BorderPanepane=newBorderPane(); pane.setCenter(clock); Scenescene=newScene(pane,250,250); primaryStage.setTitle("DisplayClock"); primaryStage.setScene(scene); primaryStage.show(); pane.widthProperty().addListener(ov-> clock.setW(pane.getWidth())); pane.heightProperty().addListener(ov-> clock.setH(pane.getHeight())); } publicstaticvoidmain(String[]args){Application.launch(args);} }
ClockPane.java
packageprimier; importjava.util.Calendar; importjava.util.GregorianCalendar; importjavafx.scene.layout.Pane; importjavafx.scene.paint.Color; importjavafx.scene.shape.Circle; importjavafx.scene.shape.Line; importjavafx.scene.text.Text; publicclassClockPaneextendsPane{ privateinthour; privateintminute; privateintsecond; //Clockpane'swidthandheight privatedoublew=250,h=250; /**Constructadefaultclockwiththecurrenttime*/ publicClockPane(){ setCurrentTime(); } /**Constructaclockwithspecifiedhour,minute,andsecond*/ publicClockPane(inthour,intminute,intsecond){ this.hour=hour; this.minute=minute; this.second=second; paintClock(); } /**Returnhour*/ publicintgetHour(){ returnhour; } /**Setanewhour*/ publicvoidsetHour(inthour){ this.hour=hour; paintClock(); } /**Returnminute*/ publicintgetMinute(){ returnminute; } /**Setanewminute*/ publicvoidsetMinute(intminute){ this.minute=minute; paintClock(); } /**Returnsecond*/ publicintgetSecond(){ returnsecond; } /**Setanewsecond*/ publicvoidsetSecond(intsecond){ this.second=second; paintClock(); } /**Returnclockpane'swidth*/ publicdoublegetW(){ returnw; } /**Setclockpane'swidth*/ publicvoidsetW(doublew){ this.w=w; paintClock(); } /**Returnclockpane'sheight*/ publicdoublegetH(){ returnh; } /**Setclockpane'sheight*/ publicvoidsetH(doubleh){ this.h=h; paintClock(); } /**Setthecurrenttimefortheclock*/ publicvoidsetCurrentTime(){ //Constructacalendarforthecurrentdateandtime Calendarcalendar=newGregorianCalendar(); //Setcurrenthour,minuteandsecond this.hour=calendar.get(Calendar.HOUR_OF_DAY); this.minute=calendar.get(Calendar.MINUTE); this.second=calendar.get(Calendar.SECOND); paintClock(); } /**Painttheclock*/ protectedvoidpaintClock(){ //Initializeclockparameters doubleclockRadius=Math.min(w,h)*0.8*0.5; doublecenterX=w/2; doublecenterY=h/2; //Drawcircle Circlecircle=newCircle(centerX,centerY,clockRadius); circle.setFill(Color.WHITE); circle.setStroke(Color.BLACK); Textt1=newText(centerX-5,centerY-clockRadius+12,"12"); Textt2=newText(centerX-clockRadius+3,centerY+5,"9"); Textt3=newText(centerX+clockRadius-10,centerY+3,"3"); Textt4=newText(centerX-3,centerY+clockRadius-3,"6"); //Drawsecondhand doublesLength=clockRadius*0.8; doublesecondX=centerX+sLength*Math.sin(second*(2*Math.PI/60)); doublesecondY=centerY-sLength*Math.cos(second*(2*Math.PI/60)); LinesLine=newLine(centerX,centerY,secondX,secondY); sLine.setStroke(Color.GRAY); //Drawminutehand doublemLength=clockRadius*0.65; doubleminuteX=centerX+mLength*Math.sin(minute*(2*Math.PI/60)); doubleminuteY=centerY-mLength*Math.cos(minute*(2*Math.PI/60)); LinemLine=newLine(centerX,centerY,minuteX,minuteY); mLine.setStroke(Color.BLUE); //Drawhourhand doublehLength=clockRadius*0.5; doublehourX=centerX+hLength* Math.sin((hour%12+minute/60.0)*(2*Math.PI/12)); doublehourY=centerY-hLength* Math.cos((hour%12+minute/60.0)*(2*Math.PI/12)); LinehLine=newLine(centerX,centerY,hourX,hourY); sLine.setStroke(Color.GREEN); getChildren().clear(); getChildren().addAll(circle,t1,t2,t3,t4,sLine,mLine,hLine); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。