设计一款日历java_使用JavaFX制作一个简单的日历

本文展示了如何使用JavaFX制作一个简单的日历,包括时钟边缘、指针和日历面板的实现,提供了详细的代码示例,适合学习JavaFX的开发者参考。
摘要由CSDN通过智能技术生成

使用JavaFX制作一个简单的日历

发布时间:2020-11-16 14:30:14

来源:亿速云

阅读:74

作者:Leah

这篇文章给大家介绍使用JavaFX制作一个简单的日历,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

具体内容如下

1.先看效果:

df222fd760474c02c85ca8abf28d9630.png

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 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();

}

}

关于使用JavaFX制作一个简单的日历就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值