JavaFX实现简单日历效果

 更新时间:2020年11月15日 20:49  点击:1926

本文实例为大家分享了JavaFX实现简单日历效果的具体代码,供大家参考,具体内容如下

1.先看效果:

2.代码:

1)ClockEdge.java类

这个类(Pane)主要是用来设置时钟边缘(为了美观对直了半天,其实想想也没必要~。~)

package com.javaBasic.javaFX; 
 
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; 
 
/** 
 * @version 1.00 2016-10-15 
 * @author Administrator 
 * 功能:显示时钟边缘 
 */ 
public class ClockEdge extends Pane{ 
 private double w , h; 
 public ClockEdge(){ 
  this(200, 200); 
  paint(); 
 } 
 public ClockEdge(double w, double h){ 
  this.w = w; 
  this.h = h; 
  paint(); 
 } 
 public double getW() { 
  return w; 
 } 
 public void setW(double w) { 
  this.w = w; 
  paint(); 
 } 
 public double getH() { 
  return h; 
 } 
 public void setH(double h) { 
  this.h = h; 
  paint(); 
 } 
 public void paint(){ 
  double clockRadius = Math.min(w, h) * 0.8 * 0.5; 
  double centerX = w / 2; 
  double centerY = h / 2; 
  Circle circle = new Circle(centerX, centerY, clockRadius); 
  circle.setFill(Color.WHITE); 
  circle.setStroke(Color.BLACK); 
  //假设一个字符宽7.6个像素,高8.8个像素 
  Text text1 = new Text(centerX + clockRadius * Math.sin(1 * Math.PI / 6) - 7.6 + 1.7 * (1 + Math.cos(2 * Math.PI / 6)) - 2.2 * Math.sin(2 * Math.PI / 6), 
        centerY - clockRadius * Math.cos(1 * Math.PI / 6) + 8.8 + 1.7 * Math.sin(2 * Math.PI / 6) - 2.2 * (1 - Math.cos(2 * Math.PI / 6)), "1"); 
  Text text2 = new Text(centerX + clockRadius * Math.sin(2 * Math.PI / 6) - 7.6 + 1.7 * (1 + Math.cos(4 * Math.PI / 6)) - 2.2 * Math.sin(4 * Math.PI / 6), 
        centerY - clockRadius * Math.cos(2 * Math.PI / 6) + 8.8 + 1.7 * Math.sin(4 * Math.PI / 6) - 2.2 * (1 - Math.cos(4 * Math.PI / 6)), "2"); 
  Text text3 = new Text(centerX + clockRadius * Math.sin(3 * Math.PI / 6) - 7.6 + 1.7 * (1 + Math.cos(6 * Math.PI / 6)) - 2.2 * Math.sin(6 * Math.PI / 6), 
        centerY - clockRadius * Math.cos(3 * Math.PI / 6) + 8.8 + 1.7 * Math.sin(6 * Math.PI / 6) - 2.2 * (1 - Math.cos(6 * Math.PI / 6)), "3"); 
  Text text4 = new Text(centerX + clockRadius * Math.sin(4 * Math.PI / 6) - 7.6 + 1.7 * (1 + Math.cos(8 * Math.PI / 6)) + 2.2 * Math.sin(8 * Math.PI / 6), 
        centerY - clockRadius * Math.cos(4 * Math.PI / 6) + 1.7 * Math.sin(8 * Math.PI / 6) + 2.2 * (1 - Math.cos(8 * Math.PI / 6)), "4"); 
  Text text5 = new Text(centerX + clockRadius * Math.sin(5 * Math.PI / 6) - 7.6 + 1.7 * (1 + Math.cos(10 * Math.PI / 6)) + 2.2 * Math.sin(10 * Math.PI / 6), 
        centerY - clockRadius * Math.cos(5 * Math.PI / 6) + 1.7 * Math.sin(10 * Math.PI / 6) + 2.2 * (1 - Math.cos(10 * Math.PI / 6)), "5"); 
  Text text6 = new Text(centerX + clockRadius * Math.sin(6 * Math.PI / 6) - 7.6 + 1.7 * (1 + Math.cos(12 * Math.PI / 6)) + 2.2 * Math.sin(12 * Math.PI / 6), 
        centerY - clockRadius * Math.cos(6 * Math.PI / 6) + 1.7 * Math.sin(12 * Math.PI / 6) + 2.2 * (1 - Math.cos(12 * Math.PI / 6)), "6"); 
  Text text7 = new Text(centerX + clockRadius * Math.sin(7 * Math.PI / 6) - 1.7 * (1 + Math.cos(14 * Math.PI / 6)) + 2.2 * Math.sin(14 * Math.PI / 6), 
        centerY - clockRadius * Math.cos(7 * Math.PI / 6) - 1.7 * Math.sin(14 * Math.PI / 6) + 2.2 * (1 - Math.cos(14 * Math.PI / 6)), "7"); 
  Text text8 = new Text(centerX + clockRadius * Math.sin(8 * Math.PI / 6) - 1.7 * (1 + Math.cos(16 * Math.PI / 6)) + 2.2 * Math.sin(16 * Math.PI / 6), 
        centerY - clockRadius * Math.cos(8 * Math.PI / 6) - 1.7 * Math.sin(16 * Math.PI / 6) + 2.2 * (1 - Math.cos(16 * Math.PI / 6)), "8"); 
  Text text9 = new Text(centerX + clockRadius * Math.sin(9 * Math.PI / 6) - 1.7 * (1 + Math.cos(18 * Math.PI / 6)) + 2.2 * Math.sin(18 * Math.PI / 6), 
        centerY - clockRadius * Math.cos(9 * Math.PI / 6) - 1.7 * Math.sin(18 * Math.PI / 6) + 2.2 * (1 - Math.cos(18 * Math.PI / 6)), "9"); 
  Text text10 = new Text(centerX + clockRadius * Math.sin(10 * Math.PI / 6) - 3.8 * (1 + Math.cos(20 * Math.PI / 6)) - 2.2 * Math.sin(20 * Math.PI / 6), 
        centerY - clockRadius * Math.cos(10 * Math.PI / 6) + 8.8 - 3.8 * Math.sin(20 * Math.PI / 6) - 2.2 * (1 - Math.cos(20 * Math.PI / 6)), "10"); 
  Text text11 = new Text(centerX + clockRadius * Math.sin(11 * Math.PI / 6) - 3.8 * (1 + Math.cos(22 * Math.PI / 6)) - 2.2 * Math.sin(22 * Math.PI / 6), 
        centerY - clockRadius * Math.cos(11 * Math.PI / 6) + 8.8 - 3.8 * Math.sin(22 * Math.PI / 6) - 2.2 * (1 - Math.cos(22 * Math.PI / 6)), "11"); 
  Text text12 = new Text(centerX + clockRadius * Math.sin(12 * Math.PI / 6) - 3.8 * (1 + Math.cos(24 * Math.PI / 6)) - 2.2 * Math.sin(24 * Math.PI / 6), 
        centerY - clockRadius * Math.cos(12 * Math.PI / 6) + 8.8 - 3.8 * Math.sin(24 * Math.PI / 6) - 2.2 * (1 - Math.cos(24 * Math.PI / 6)), "12"); 
  getChildren().addAll(circle, text1, text2, text3, text4, text5, text6, text7, text8, text9, text10, text11, text12); 
  for(int i =1; i<= 60; i++){ 
   double pointX1 = centerX + clockRadius * 0.95 * Math.sin(i * (2 * Math.PI) / 60); 
   double pointY1 = centerY - clockRadius * 0.95 * Math.cos(i * (2 * Math.PI) / 60); 
   double pointX2 = centerX + clockRadius * 1.0 * Math.sin(i * (2 * Math.PI) / 60); 
   double pointY2 = centerY - clockRadius * 1.0 * Math.cos(i * (2 * Math.PI) / 60); 
   if(i % 5 == 0) continue; 
   else{ 
    Line point = new Line(pointX1, pointY1, pointX2, pointY2); 
    getChildren().add(point); 
   } 
  } 
 } 
  
} 

2)ClockPointer.java类

这个类(Pane)主要用来显示时钟的三个指针(时、分、秒);

package com.javaBasic.javaFX; 
 
import java.util.Calendar; 
import java.util.GregorianCalendar; 
import javafx.scene.layout.Pane; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Line; 
/** 
 * @version 1.00 2016-10-15 
 * @author Administrator 
 * 功能:显示时钟指针 
 */ 
public class ClockPointer extends Pane{ 
 private int hour; 
 private int minute; 
 private int second; 
 private double w = 200, h = 200; 
 public ClockPointer(){ 
  setCurrentTime(); 
 } 
 public ClockPointer(int hour, int minute, int second){ 
  this.hour = hour; 
  this.minute = minute; 
  this.second = second; 
  paint();  
 } 
 public int getHour(){ 
  return hour; 
 } 
 public void setHour(int hour){ 
  this.hour = hour; 
  paint(); 
 } 
 public int getMinute(){ 
  return minute; 
 } 
 public void setMinute(int minute){ 
  this.minute = minute; 
  paint(); 
 } 
 public int getSecond(){ 
  return second; 
 } 
 public void setSecond(int second){ 
  this.second = second; 
  paint(); 
 } 
 public double getW() { 
  return w; 
 } 
 public void setW(double w) { 
  this.w = w; 
  paint(); 
 } 
 public double getH() { 
  return h; 
 } 
 public void setH(double h) { 
  this.h = h; 
  paint(); 
 } 
 public String setCurrentTime(){ 
  String str1, str2, str3;
  Calendar calendar = new GregorianCalendar(); 
  this.hour = calendar.get(Calendar.HOUR_OF_DAY); 
  this.minute = calendar.get(Calendar.MINUTE); 
  this.second = calendar.get(Calendar.SECOND);
  str1 = String.valueOf(hour);
  str2 = String.valueOf(minute);
  str3 = String.valueOf(second);
 if (hour < 10) {
 str1 = "0" + hour;
 }
 if (minute < 10) {
 str2 = "0" + minute;
 }
 if (second < 10) {
 str3 = "0" + second;
 }
  paint();
  return str1 + " : " + str2 + " : " + str3; 
 } 
 protected void paint(){ 
  getChildren().clear(); 
  double clockRadius = Math.min(w, h) * 0.8 * 0.5; 
  double centerX = w / 2; 
  double centerY = h / 2; 
  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); 
  double mLength = clockRadius * 0.65; 
  double minuteX = centerX + mLength * Math.sin(minute * (2 * Math.PI) / 60); 
  double minuteY = centerY - mLength * Math.cos(minute * (2 * Math.PI) / 60); 
  Line mLine = new Line(centerX, centerY, minuteX, minuteY); 
  mLine.setStroke(Color.BLUE); 
  double hLength = clockRadius * 0.5; 
  double hourX = centerX + hLength * Math.sin(hour * (2 * Math.PI) / 12); 
  double hourY = centerY - hLength * Math.cos(hour * (2 * Math.PI) / 12); 
  Line hLine = new Line(centerX, centerY, hourX, hourY); 
  mLine.setStroke(Color.GREEN); 
  getChildren().addAll(sLine, mLine, hLine); 
 } 
} 

3)CalendarPanel.java类

这个类(Pane)用来显示日历(这里用到了一个字体Cooper Black一般系统应该都有,没有就得添加)

package com.javaBasic.javaFX; 
 
import javafx.scene.layout.Pane; 
import javafx.scene.layout.ColumnConstraints; 
import javafx.scene.layout.GridPane; 
import javafx.scene.control.Label; 
import javafx.scene.paint.Color; 
import javafx.geometry.HPos; 
import javafx.geometry.Insets; 
import javafx.geometry.Pos; 
import javafx.scene.text.Font; 
import javafx.scene.text.FontWeight; 
import javafx.scene.text.Text; 
import java.util.Calendar; 
/** 
 * @version 1.00 2016-10-17 
 * @author Administrator 
 * 功能:显示日历 
 */ 
 
public class CalendarPanel extends Pane{ 
 private int year; 
 private int month; 
 private int day; 
 private int firstDayOfWeek; 
 private int totalDayOfMonth; 
  
 public CalendarPanel(){ 
   
  Calendar calendar = Calendar.getInstance(); 
  year = calendar.get(Calendar.YEAR); 
  month = calendar.get(Calendar.MONTH) + 1; 
  day = calendar.get(Calendar.DAY_OF_MONTH); 
  totalDayOfMonth = calendar.getActualMaximum(Calendar.DATE); 
  calendar.set(Calendar.DAY_OF_MONTH, 1); 
  firstDayOfWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1; 
  paint(); 
 } 
 public void paint(){ 
  GridPane cp = new GridPane(); 
  String[] week = new String[]{"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"}; 
  cp.setPadding(new Insets(30, 30, 10, 10)); 
  Text text1 = new Text(year + "年" + month + "月"); 
  text1.setStroke(Color.GREEN); 
  cp.setAlignment(Pos.CENTER); 
  cp.add(text1, 0, 0); 
  GridPane.setColumnSpan(text1, 7); 
  GridPane.setHalignment(text1, HPos.CENTER); 
  for(int i = 0; i < 7; i++){ 
   Label label = new Label(week[i]); 
   if(i == 0 || i == 6) label.setTextFill(Color.RED); 
   cp.add(label, i, 1); 
   cp.getColumnConstraints().add(new ColumnConstraints(30)); 
   GridPane.setHalignment(label, HPos.CENTER); 
  } 
  for(int j = 0; j < totalDayOfMonth; j++){ 
   Label label = new Label(j + 1 +""); 
   if (j + 1 == day) label.setFont(Font.font("Cooper Black", FontWeight.BOLD, 20)); 
   int k = firstDayOfWeek + j; 
   if((k % 7 == 0) || (k % 7 == 6)) label.setTextFill(Color.RED); 
   cp.add(label, k % 7, 2 + k / 7); 
   GridPane.setHalignment(label, HPos.RIGHT); 
  } 
  getChildren().add(cp); 
 } 
 
}

4)主面板ClockMainPanel.java

这个类(Pane)是用于将上面三个面板合成主面板

package com.javaBasic.javaFX; 
 
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.scene.layout.BorderPane;
import javafx.scene.layout.StackPane;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import javafx.util.Duration; 
/** 
 * @version 1.00 2016-10-17 
 * @author Administrator 
 * 功能:各个面板Pane合成一个时钟面板ClockMainPanel 
 */ 
public class ClockMainPanel extends Application { 
 String NowTime; 
 public static void main(String[] args) { 
  // TODO Auto-generated method stub 
  Application.launch(args); 
 } 
 public void start(Stage primaryStage){ 
  ClockEdge ce = new ClockEdge(); 
  ClockPointer cp = new ClockPointer(); 
  StackPane sp = new StackPane(ce, cp); 
  StackPane nt = new StackPane(); 
  CalendarPanel caPa = new CalendarPanel(); 
  BorderPane bp = new BorderPane(); 
  bp.setLeft(sp); 
  bp.setRight(caPa); 
  bp.setBottom(nt); 
  Scene scene = new Scene(bp, 420, 200); 
  EventHandler<ActionEvent> eventHandler = e ->{ 
   nt.getChildren().clear(); 
   NowTime = (String) cp.setCurrentTime(); 
   Text tt= new Text(NowTime);
   tt.setFont(Font.font("Times New Roman", 20));
   nt.getChildren().add(tt); 
  }; 
  Timeline animation = new Timeline( 
   new KeyFrame(Duration.millis(1000), eventHandler)); 
  animation.setCycleCount(Timeline.INDEFINITE); 
  animation.play(); 
  primaryStage.setTitle("Perpetual calendar"); 
  primaryStage.setScene(scene); 
  primaryStage.show(); 
 } 
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持猪先飞。

[!--infotagslink--]

相关文章

  • Jquery日历插件制作简单日历

    在页面开发中,经常遇到需要用户输入日期的操作。通常的做法是,提供一个文本框(text),让用户输入,然后,编写代码验证输入的数据,检测其是否是日期类型。这样比较麻烦,同时,用户输入日期的操作也不是很方便,影响用户体验。如果使...2015-10-30
  • php简单日历函数

    本文实例讲述了php实现的日历程序。分享给大家供大家参考。具体如下:<&#63;php /* * php 输出日历程序 */ header("Content-type: text/html;charset=utf-8"); $year=(!isset($_GET['year'])||$_GET['year']=="")&#63;...2015-10-30
  • 教大家制作简单的php日历

    最近的一个项目中,需要将数据用日历方式显示,网上有很多的JS插件,后面为了自己能有更大的控制权,决定自己制作一个日历显示。如下图所示:一、计算数据 1、new一个Calendar类2、初始化两个下拉框中的数据,年份与月份3、初始...2015-11-24
  • C#实现农历日历的方法

    这篇文章主要介绍了C#实现农历日历的方法,详细分析了使用C#实现农历日历的完整步骤,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • 一起学写js Calender日历控件

    这篇文章主要和大家一起学写js Calender控件,自己动手编写了一个简易日历控件,感兴趣的小伙伴们可以参考一下...2016-04-17
  • JavaScript制作简单的日历效果

    这篇文章主要为大家介绍了JavaScript制作简单的日历效果实现代码,感兴趣的小伙伴们可以参考一下...2016-03-12
  • php简单日历函数

    本文实例讲述了php实现的日历程序。分享给大家供大家参考。具体如下:<&#63;php /* * php 输出日历程序 */ header("Content-type: text/html;charset=utf-8"); $year=(!isset($_GET['year'])||$_GET['year']=="")&#63;...2015-10-30
  • ASP.NET Calendar日历(日期)控件使用方法

    本文主要介绍Calendar日历控件的各个属性以及举例演示Calendar控件的具体使用方法,希望对大家有所帮助。...2021-09-22
  • C#实现功能强大的中国农历日历操作类

    这篇文章主要介绍了C#实现功能强大的中国农历日历操作类,实例分析了C#操作时间及字符串的技巧,非常具有实用价值,需要的朋友可以参考下...2020-06-25
  • C语言打印某一年的日历

    这篇文章主要为大家详细介绍了C语言打印某一年的日历,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-06-14
  • javascript html实现网页版日历代码

    这篇文章主要介绍了javascript html实现网页版日历代码,需要的朋友可以参考下...2016-03-10
  • ASP.NET中实现弹出日历示例

    这篇文章介绍了ASP.NET弹出日历功能的实现方法,有需要的朋友可以参考一下。...2021-09-22
  • 基于jquery实现日历效果

    这篇文章主要为大家详细介绍了基于jquery实现日历效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-03-14
  • js编写当天简单日历效果【实现代码】

    下面小编就为大家带来一篇js编写当天简单日历效果【实现代码】。小编觉得挺不错的,现在分享给大家,也给大家做个参考...2016-05-05
  • PHP简单日历实例

    <?php /* * PHP简单日历实例 * 作者: 多菜鸟 * 邮箱: kingerq AT msn DOT com * 来源: http://blog.111cn.net/kingerq/ * 创建时间: 2008-01-03 **/ $...2016-11-25
  • asp.net基于Calendar实现blog日历功能示例

    这篇文章主要介绍了asp.net基于Calendar实现blog日历功能,涉及asp.net使用Calendar控件操作日期与时间相关运算技巧,需要的朋友可以参考下...2021-09-22
  • php简单日历实现程序代码

    关于日历的应用,应该在独立博客上面能很好的体现出来吧,不管是 php 的 wp 博客,还是 ASP 的 z_blog 博客,都应用了日历的功能,那就是日志存档了,在我们要看以前发布的日志时...2016-11-25
  • JavaScript快速实现日历效果

    这篇文章主要为大家详细介绍了JavaScript快速实现日历效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-03-07
  • Illustrator绘制可以翻页的日历图标教程

    今天小编在这里就来给Illustrator的这一款软件的使用者们来说一说绘制可以翻页的日历图标的教程,各位想知道具体绘制方法的使用者们,那么下面就快来跟着小编一起看看吧...2016-09-14
  • Android实现系统日历同步日程

    这篇文章主要为大家详细介绍了Android实现系统日历同步日程,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-04-27