JavaFx——动态时钟的实现(线程,线程池)

实现效果

在这里插入图片描述

代码结构

在这里插入图片描述

ClockPane与DisplayClock的代码组合,可以实现如上的时钟界面,但是时间是静态的,取到的时间只能是当前的运行的时候的时间
ClockPane与ClockAnimation的低吗组合,可以实现动态时钟的界面。

全部代码

ClockPane的代码

package Clock;

import java.util.Calendar;
import java.util.GregorianCalendar;

import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Line;
import javafx.scene.text.Text;

public class ClockPane extends Pane {
   private int hour;
 
private int minute;
   private int second;
   public ClockPane() {
	   setCurrentTime();
   }
   public ClockPane(int hour, int minute, int second) {
		
		this.hour = hour;
		this.minute = minute;
		this.second = second;
	}
	public int getHour() {
		return hour;
	}
	public void setHour(int hour) {
		this.hour = hour;
		paintClock();
	}
	public int getMinute() {
		return minute;
	}
	public void setMinute(int minute) {
		this.minute = minute;
		paintClock();
	}
	public int getSecond() {
		return second;
	}
	public void setSecond(int second) {
		this.second = second;
		paintClock();
	}
	
	public void setCurrentTime() {
		Calendar calendar=new GregorianCalendar();
		this.hour=calendar.get(Calendar.HOUR_OF_DAY);
		this.minute=calendar.get(Calendar.MINUTE);
		this.second=calendar.get(Calendar.SECOND);
		paintClock();
	}

	void paintClock() {
		double clockRadius=Math.min(getWidth(), getHeight())*0.8*0.5;
		  double centerX=getWidth()/2;
		  double centerY=getHeight()/2;
		  Circle circle=new Circle(centerX,centerY,clockRadius);
		  circle.setFill(Color.WHITE);
		  circle.setStroke(Color.BLACK);
		  Text t1=new Text(centerX-5,centerY-clockRadius+12,"12");
		  Text t2=new Text(centerX-clockRadius+3,centerY+5,"9");
		  Text t3=new Text(centerX+clockRadius-10,centerY+3,"3");
		  Text t4=new Text(centerX-3,centerY+clockRadius-3,"6");
		  
		  double sLength=clockRadius*0.8;
		  double secondX=centerX+sLength*Math.sin(second*(2*Math.PI/60));
		  double secondY=centerY-sLength*Math.cos(second*(2*Math.PI/60));
		  
		  Line sLine=new Line(centerX,centerY,secondX,secondY);
		  sLine.setStroke(Color.RED);
		  //draw minute hand
	      double mLength=clockRadius*0.65;
	      double xMinute=centerX+mLength*Math.sin((minute+second/60)*(2*Math.PI/60));
	      double yMinute=centerY-mLength*Math.cos((minute+second/60)*(2*Math.PI/60));
	      Line mLine=new Line(centerX,centerY,xMinute,yMinute);
	      mLine.setStroke(Color.BLUE);
	      //draw hour hand
	      double hLength=clockRadius*0.5;
	      double hourX=centerX+hLength*Math.sin((hour%12+minute/60.0+second/(60*60))*(2*Math.PI/12));
	      double hourY=centerY-hLength*Math.cos((hour%12+minute/60.0+second/(60*60))*(2*Math.PI/12));
	      Line hLine=new Line(centerX,centerY,hourX,hourY);
	      hLine.setStroke(Color.GREEN);
	      getChildren().clear();
	      getChildren().addAll(circle,t1,t2,t3,t4,sLine,mLine,hLine);
	}
   @Override
   public void setWidth(double width) {
	   super.setWidth(width);
	   paintClock();
	   
   }
   @Override
   public void setHeight(double height) {
	  super.setHeight(height);
	   paintClock();
   }
}

DisplayClock的代码

package Clock;

import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class DisplayClock extends Application {

	@Override
	public void start(Stage primaryStage) throws Exception {
	   ClockPane  clock=new ClockPane();
	   String timeString=clock.getHour()+":"+clock.getMinute()+":"+clock.getSecond();
	   BorderPane pane=new BorderPane();
	   Label currentTimeLabel=new Label(timeString);
	   pane.setCenter(clock);
	   pane.setBottom(currentTimeLabel);
	   BorderPane.setAlignment(currentTimeLabel, Pos.CENTER);
	   
	   Scene scene=new Scene(pane,300,300);
	   primaryStage.setScene(scene);
	   primaryStage.setTitle("DisplayClock");
	   primaryStage.show();
	 
	   
        
	}
	public static void main(String[] args) {
		launch(args);
	}

}

ClockAnimation的代码

package Clock;


import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.util.Duration;

public class ClockAnimation extends Application{
	public void start(Stage primaryStage) throws Exception {
		 ClockPane  clock=new ClockPane();
		  //creat a handle for
	       EventHandler<ActionEvent>eventHandler=event -> {clock.setCurrentTime();};
	        Timeline animation=new Timeline(new KeyFrame(Duration.millis(1000),eventHandler));
	        //循环计数
	        animation.setCycleCount(Timeline.INDEFINITE);
	        animation.play();

	        Scene scene=new Scene(clock,300,300);
	        primaryStage.setTitle("ClockAnimation");
	        primaryStage.setScene(scene);
	        primaryStage.show();
	    }

		 
	        
	public static void main(String[] args) {
		launch(args);
	}

}
  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值