JavaFX实现简单日历效果
作者:Mst5u 发布时间:2023-05-16 08:43:30
标签:JavaFX,日历
本文实例为大家分享了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();
}
}
来源:https://blog.csdn.net/smart_snail/article/details/52843497
0
投稿
猜你喜欢
- java 使用异常的好处总结一、分析Java异常处理机制确实比较慢,这个“比较慢”是相对于诸如String、Integer等对象来说,单单从
- using System; using System.Collections.Generic; using System.Text; usi
- 前言本文主要给大家介绍的是关于Java对xls文件进行读写操作的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍:wi
- 工作中一直都是一个人奋战一人一个项目,使用maven管理,看这个也挺好,但是总感觉没有充分发挥maven的功能,于是研究了一下这个,网上关于
- Interface Segregation Principle,ISP接口隔离原则主张使用多个专门的接口比使用单一的总接口要好。一个类对另外
- File类概述File类能新建、删除、重命名文件和目录,但不能访问文件内容本身,如果需要访问文件内容本身,则需要使用后续的输入/输出流。要在
- 一、原理1、不变模式(不可变对象)在并行软件开发过程中,同步操作似乎是必不可少的。当多线程对同一个对象进行读写操作时,为了保证对象数据的一致
- 文件资源操作Spring 定义了一个 org.springframework.core.io.Resource 接口,Resource 接口
- Socket异常客户端异常java.net.ConnectException: Connection refused: connect。该异
- 本文需求实现了java通过方向键控制小球移动的具体过程,供大家参考,具体内容如下需求分析:第一 要画出一个小球第二 要能通过控制方向键控制它
- 一、概念 1. 为了能让程序操作数据库,对数据库中的表进行操作,每一种数据库都会提供一套连接和操作该数据库的驱动,而且每种数据库
- 1 框架组成SpringSpringMVCMyBatis2 所需工具Mysql 8.0.15数据库管理系统,创建数据库Tomcat 8.5.
- 一:需求当小数位很多的时候,小数位后面可能有一些多余的0并没有任何实际意义。所以在某些业务需求下可以去掉这些多余的0。例如:0.2000可以
- yml 文件规则yml文件的好处,天然的树状结构,一目了然,实质上跟properties是差不多的。不支持tab缩进可以使用 "-
- 本文实例讲述了Java常用内置注解。分享给大家供大家参考,具体如下:一 通过@SuppressWarnings关闭警告信息1 代码publi
- 这篇文章主要介绍了springboot如何使用AOP做访问请求日志,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价
- 在基于UI元素的自动化测试中, 无论是桌面的UI自动化测试,还是Web的UI自动化测试. 首先我们需要查找和识别UI
- 前言Spring Boot 中提供一个全局的配置文件:application.properties,这个配置文件的作用就是,允许我们通过这个
- 前言最近看插件库上少有的取色器大都是圆形的或者奇奇怪的的亚子,所以今天做两个矩形的颜色取色器提示:以下是本篇文章正文内容,下面案例可供参考一
- SpringBoot项目中新增脱敏功能项目背景目前正在开发一个SpringBoot项目,此项目有Web端和微信小程序端。web端提供给工作人