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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。