利用JavaFX设计一个简易的时钟

JavaFX制作一个简单的时钟 工具:Idea和JavaFX Scene Builder,与Eclipse+JavaFX没什么区别一、创建JavaFX项目1. 选择javafx项目 要求:JDK8及其以上 2. javafx项目清单 创建完成后,idea会自动生成一个样例。 再样例上修改或者按照样例重新创建Main类、Controller类及fxml文件也可以 这里我们重新创建这三个文件 3. 创建Main、Control 阅读详情

首先要在面板中显示一个时钟,我们可以设计一个ClockPane类来显示一个时钟。

最终效果:
这里写图片描述

若要绘制一个时钟,需要绘制一个圆并为秒钟、分钟和小时绘制三个指针。为了画一个指针,需要确定一条直线的两端:一端是时钟的中央,位于(centerX,centerY);另外一端位于(endX,endY),由一下公式来确定:
endX=centerX+handLength×sin(θ)
endY=centerY-handLength×cos(θ)
(其中θ是指针和竖直方向12点的夹角)

因为一分钟有60秒,所以第2个指针的角度是:second×(2π/60)
分钟的位置由分钟和秒钟来决定。包含秒数的确切分钟数是minu+second/60。例如,如时间是3分30秒,那么总的分钟数就是3.5。由于一小时有60分钟,因此分针的角度是:(minute+second/60)×(2π/12)

由于一个圆被分为12个小时,所以时针的角度是:(hour+minute/60+second/(60×60))×(2π/12)

为了简化计算,在计算分针和时针角度的时候,可以忽略秒针,因为它们数字太小,基本可以忽略。因此,秒针、分针以及时针的端点可以如下计算:
secondX = centerX + secondHandLength × sin(second × (2π/60))
secondY = centerY - secondHandLength × cos(second × (2π/60))
minuteX = centerX + minuteHandLength × sin(minute × (2π/60))
minuteY = centerY - minuteHandLength × cos(minute × (2π/60))
hourX = centerX + hourHandLength × sin((hour+minute/60) × (2π/12))
hourX = centerX + hourHandLength × sin((hour+minute/60) × (2π/12))

这样就得到了ClockPane类的实现程序:

package com.company;

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;
import java.util.Calendar;
import java.util.GregorianCalendar;

public class ClockPane extends Pane{
    private int hour;
    private int minute;
    private int second;
    private double w=250,h=250;

    public ClockPane() {
        setCurrentTime();
    }

    public ClockPane(int hour,int minute,int second) {
        this.hour=hour;
        this.minute=minute;
        this.second=second;
        paintClock();
    }

    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 double getW() {
        return w;
    }

    public void setW(double w) {
        this.w=w;
        paintClock();
    }

    public double getH() {
        return h;
    }

    public void setH(double h) {
        this.h=h;
        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();
    }

    protected void paintClock() {
        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);

        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 scondX=centerX+sLength*Math.sin(second*(2*Math.PI/60));
        double scondY=centerY-sLength*Math.cos(second*(2*Math.PI/60));
        Line sline=new Line(centerX,centerY,scondX,scondY);
        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%12+minute/60.0)*(2*Math.PI/12));
        double hourY=centerY-hLength*Math.cos((hour%12+minute/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);

    }
}

对程序的简要解读:①Java API的GregorianCalendar类可以使用它的无参构造方法来商城一个具有当前时间的Calendar实例。可以从一个Calendar对象,通过调用它的get(Calendar.HOUR)、get(Calendar.MINUTE)和get(Calendar.SECOND)方法来返回小时、分钟以及秒钟。②因为paintClock()方法在任何一个新的属性(hour、minute、second、w以及h)被设置的时候调用,所以之前的内容从面板中被清除。

然后就需要设计一个ClockAnimation类来显示时钟的动画

Timeline类可以用于通过使用一个或者更多的KeyFrame(关键帧)来编写任意动画。
你可以用Timeline来控制时钟的重绘,代码如下:

package com.company;

import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
import javafx.util.Duration;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.animation.KeyFrame;
import javafx.scene.control.Label;

public class ClockAnimation extends Application {
    @Override
    public void start(Stage primaryStage) {
        ClockPane clock=new ClockPane();
        BorderPane borderPane=new BorderPane();

        EventHandler<ActionEvent> eventHandler=e -> {
            clock.setCurrentTime();
            String timeString=clock.getHour()+":"+clock.getMinute()+":"+clock.getSecond();
            Label lblCurrentTime=new Label(timeString);
            borderPane.setCenter(clock);
            borderPane.setBottom(lblCurrentTime);
            BorderPane.setAlignment(lblCurrentTime, Pos.TOP_CENTER);
        };

        Timeline animation=new Timeline(new KeyFrame(Duration.millis(1000),eventHandler));
        animation.setCycleCount(Timeline.INDEFINITE);
        animation.play();

        Scene scene=new Scene(borderPane,250,250);
        primaryStage.setTitle("ClockAnimation");
        primaryStage.setScene(scene);
        primaryStage.show();

        borderPane.widthProperty().addListener(ov ->
            clock.setW(borderPane.getWidth())
        );

        borderPane.heightProperty().addListener(ov ->
            clock.setH(borderPane.getHeight())
        );
    }
}

程序简单解读:①在时间线动画的每个关键帧中,这个处理器每秒被调用一次。所以动画中的时间每秒被更新一次。②最后两个监听器是用来修改时钟的面板的大小的,将这个监听器和窗体的宽度和高度属性进行注册,从而在场景的宽度和高度改变的情况下可以重新设置面板大小。代码保证了时钟面板的大小和场景大小是同步的。

最后运行就能达到上面图所示的效果了。

QT实现HTTP文件(夹)下载的完整流程与实战技巧 本文详细介绍了使用QT框架实现HTTP文件和文件夹下载的完整流程与实战技巧。通过QNetworkAccessManager等核心类,讲解了从单文件下载、大文件处理、进度显示、暂停/取消功能,到复杂的文件夹下载策略。文章重点剖析了断点续传、错误处理与网络健壮性等关键问题,为C++桌面应用集成稳定高效的下载功能提供了专业指导。 阅读详情

相关推荐

comfyui中的k采样器报错Given groups=1, weight of size [320, 4, 3, 3], expected input[2, 8, 96, 54] to have 4

求助大佬!!!我运行comfyui的时候,k采样器变紫,同时报错显示:

M1226401728的博客 5180

Javafx 时钟绘制

核心为三个函数: 第一个为 public void dials,绘制表盘 第二个为public void scale,绘制刻度,这里需要注意的是字体旋转 第三个为public void point,绘制秒分时针以及打印时间,需要注意的是进制问题 总的javafx源码如下: package com.wu.demo; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import javafx.anima

一夜星尘 1万+

故障诊断知识库建设指南

从数据融合到知识图谱构建,从智能推理引擎开发到动态进化机制落地,故障诊断知识库的建设路径已形成 “数据 - 知识 - 智能” 的闭环体系。随着大模型技术的深度融入,知识库将实现从 “规则驱动” 到 “认知推理” 的跨越 —— 通过自然语言理解解析复杂故障描述、多模态分析融合图像与信号数据、预测性算法推演故障发展趋势,持续提升诊断的精准度与前瞻性。

极昆仑智慧 1232

JavaFX-绘制时钟界面

JavaFX-绘制时钟界面

m0_56962811的博客 1072

STM32F407通过SMBus协议精准读取BQ40Z50电池电量

本文详细介绍了STM32F407通过SMBus协议精准读取BQ40Z50电池电量的实现方法。从硬件连接到软件驱动开发,再到通信异常排查,提供了完整的解决方案。重点解析了SMBus协议的特殊时序要求、GPIO模拟驱动的关键代码,以及实际调试中的常见问题与对策,帮助开发者高效完成电池管理系统开发。

weixin_29189003的博客 251

openEuler服务器离线安装实战:从Docker到Samba的完整避坑指南

本文提供了一份详尽的openEuler服务器离线部署实战指南,重点解决了在无网络环境下安装Docker、Samba等软件的依赖难题。文章深入对比了`dnf install`、`rpm`直接安装及禁用仓库安装三种核心方法,并分享了构建本地DNF仓库的进阶策略,旨在帮助运维人员构建高效可靠的离线部署工作流。

weixin_29210759的博客 71

珍藏的javafx教程——简单了解

是java实现图形界面的一种方式,其他还有java的awt、swing,但是逐渐被淘汰。javafx可以实现逻辑和样式的分离,可以使用xml和css来编写样式。在学习之前请确保你已经熟练掌握面向对象、包装类、枚举、注解、匿名对象等内容的概念和使用。自从java11以后,jdk已经不内置javafx库,已交给开源社区管理,所以我们需要自己导入。可以到这个网址去下载 jar 包。注意下载的类型是sdk。gluonhq.com使用maven的同学可以使用以下语句导入 本教程使用的java版本是18,因此可能与

不定时分享最优质的网络技术与教程,满满的干货。 2909

脱壳--02.exe

程序开始 使用OD打开程序 发现无法利用esp定律 程序直接运行 查找模块间调用 随便找到一个函数的调用 发现是FF15方式调用 所以是vs的程序 vs程序大致分成两种 vs20xx (特征函数:GetSystemTimeAsFileTime)和 vc++6.0(特征函数:GetVersion) 通过链接器版本 发现是vc6.0 直接在GetVersion上下断点 重新运行程序 断点断下 返回到调用处 vc6.0和易语言的第一个CALL都是GetVers...

weixin_45012273的博客 1112

javafx 开发知识点与要点

整理javafx开发知识点。

亲测,只为展现最完美的有效! 2038

高云FPGA系列教程(8):ARM串口数据接收(中断和轮询方式)

GW1NSR-4C ARM部分共有2个串口外设,都挂载在APB1总线上,最高支持波特率921.6Kbit/s,无奇偶校验位,8位数据位,1位停止位,支持高速测试模式 HSTM(High Speed Test Mode),即每个时钟周期输出1位数据,可以在短时间内传输大量数据。官方手册上没有描述发送和接收缓存FIFO的深度,所以不确定是否支持缓存。

whik1194的博客 1684

基于Python实现身份证信息识别

身份证是一种重要的证件,包含了个人的基本信息,如姓名、性别、出生日期、住址等。在实际应用中,有时需要对身份证进行自动化的识别,以提高工作效率和准确性。本文将介绍如何使用Python实现身份证信息的识别,通过图像预处理、OCR技术和解析算法,实现对身份证号码和其他信息的提取和解析。

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 1万+

学习JavaFX Script,第一部分:针对Java程序员的JavaFX介绍

      原文地址:http://java.sun.com/developer/technicalArticles/scripting/javafxpart1/         JavaFX Script编程语言(以下称为JavaFX)有Sun微系统公司开发的一种declarative, statically typed(声明性的、静态类型)脚本语言。如Open JavaFX(OpenJFX

mydeman的学习日志 3951

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

利用JavaFX设计一个简易的动态时钟

简易动态时钟 最终效果: 绘制时钟面板 若要绘制一个时钟,需要绘制一个圆并为秒钟、分钟和小时绘制三个指针。为了画一个指针,需要确定一条直线的两端:一端是时钟的中央,位于(centerX,centerY);另外一端位于(endX,endY),由一下公式来确定: endX=centerX+handLength×sin(θ) endY=centerY-handLength×cos(θ) (其中θ是指针和竖直方向12点的夹角) 因为一分钟有60秒,所以第2个指针的角度是:second×(2π/60) 分钟的位置由

yh991314的博客 2803

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

[JavaFX] 绘制简易时钟(一)

主函数文件 ShowClock: package primier; import javafx.application.Application; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.stage.Stage; import javaf...

酸甜梅子的部落格 1287

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

java 简易的闹钟设计_JavaFX实现简易时钟效果

本文实例为大家分享了JavaFX实现简易时钟效果的具体代码,供大家参考,具体内容如下首先要在面板中显示一个时钟,我们可以设计一个ClockPane类来显示一个时钟。最终效果:若要绘制一个时钟,需要绘制一个圆并为秒钟、分钟和小时绘制三个指针。为了画一个指针,需要确定一条直线的两端:一端是时钟的中央,位于(centerX,centerY);另外一端位于(endX,endY),由一下公式来确定:endX...

weixin_39782752的博客 741

[JavaFX] 绘制简易时钟(二)

在前一篇博客中,我们已经绘制了一个静止时钟。 绘制简易时钟(一) 首先进行一个微调:让表盘根据窗口大小自动调整大小: 在 ShowClock.start() 中,添加对面板长宽的监听。 pane.widthProperty().addListener(ov -> clock.setW(pane.getWidth())); pane.heightProperty().addListener...

酸甜梅子的部落格 752

java做时钟短代码_JavaFX实现简易时钟效果(一)

本文实例为大家分享了JavaFX实现简易时钟效果的具体代码,供大家参考,具体内容如下效果图用当前时间创建时钟,绘制表盘。钟表是静止的。让指针动起来,请参照:绘制简易时钟(二)主函数文件 ShowClock:package primier;import javafx.application.Application;import javafx.geometry.Insets;import javafx...

weixin_34462581的博客 736

java中有ClockPane类吗,JavaFX实现简易时钟效果(二)

本文实例为大家分享了JavaFX实现简易时钟效果的具体代码,供大家参考,具体内容如下在前一篇博客中,我们已经绘制了一个静止时钟。绘制简易时钟(一)首先进行一个微调:让表盘根据窗口大小自动调整大小:在 ShowClock.start() 中,添加对面板长宽的监听。pane.widthProperty().addListener(ov -> clock.setW(pane.getWidth())...

weixin_31308407的博客 393

java钟表动画_JavaFX实现简易时钟效果

本文实例为大家分享了javafx实现简易时钟效果的具体代码,供大家参考,具体内容如下首先要在面板中显示一个时钟,我们可以设计一个clockpane类来显示一个时钟。最终效果:若要绘制一个时钟,需要绘制一个圆并为秒钟、分钟和小时绘制三个指针。为了画一个指针,需要确定一条直线的两端:一端是时钟的中央,位于(centerx,centery);另外一端位于(endx,endy),由一下公式来确定:endx...

weixin_29670781的博客 915

java 简单时钟界面_JavaFX实现简易时钟效果(一)

本文实例为大家分享了javafx实现简易时钟效果的具体代码,供大家参考,具体内容如下效果图用当前时间创建时钟,绘制表盘。钟表是静止的。让指针动起来,请参照:主函数文件 showclock:package primier;import javafx.application.application;import javafx.geometry.insets;import javafx.geometry...

weixin_33508642的博客 794

如何利用JavaFx写一个简易版的时钟?

下面的代码主要是两个类,NewClockPane类主要是绘制一个时钟,ClockAnimation类主要是通过设置动画将时钟动起来。要想要编写一个时钟重要的是三个指针设置动画随着自己的周期而转动。

qq_61945024的博客 432

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

文章目录实现效果代码结构全部代码 实现效果 代码结构 ClockPane与DisplayClock的代码组合,可以实现如上的时钟界面,但是时间是静态的,取到的时间只能是当前的运行的时候的时间 ClockPane与ClockAnimation的低吗组合,可以实现动态时钟的界面。 全部代码 ClockPane的代码 package Clock; import java.util.Calend...

qq_43918130的博客 1921

javafx 时钟 闹钟 钟表 模拟时钟 动态时钟

javafx 时钟 闹钟 钟表 模拟时钟 动态时钟

2020毕业,6年java开发者,坐标福州 827

java小时钟实验报告_JAVA实验报告(运用JavaFx实现时钟动画).doc

JAVA实验报告(运用JavaFx实现时钟动画),javafx时钟,javafx动画,javafx等待动画,javafx动画效果,时钟动画,ppt时钟动画,时钟机关之星动画化,flash时钟动画,flash制作时钟动画JAVA实验报告实验二 运用JavaFx实现时钟动画班 级: 计算机科学与技术1306学 号: 0902130610姓 名: 王 雨 ...

weixin_31998371的博客 1110

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

使用JavaFX制作一个简单的日历发布时间:2020-11-16 14:30:14来源:亿速云阅读:74作者:Leah这篇文章给大家介绍使用JavaFX制作一个简单的日历,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。具体内容如下1.先看效果:2.代码:1)ClockEdge.java类这个类(Pane)主要是用来设置时钟边缘(为了美观对直了半天,其实想想也没必要~。~)pac...

weixin_36151775的博客 652
上一篇: Java编写一个简单的Web爬虫
下一篇: 利用JavaFX实现一个弹球动画
Hold_My_Own
博客等级 码龄10年 122粉丝 177原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值