Java语言程序设计基础篇_编程练习题*15.32(控制时钟)

*15.32(控制时钟)

修改程序淸单14-21,在类中加入动画。添加两个方法 start() 和 stop() 以启动和停止时钟。编写一个程序,让用户使用 Start 和 Stop 按钮来控制时钟,如图15-36a所示

代码示例:编程练习题15_32ClockPane.java

package chapter_15;import java.util.Calendar;
import java.util.GregorianCalendar;import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
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 javafx.stage.Stage;
import javafx.util.Duration;public class 编程练习题15_32ClockPane extends Application{@Overridepublic void start(Stage primaryStage) throws Exception {ClockPane clock = new ClockPane();clock.setCurrentTime();HBox hBox = new HBox(5);Button btStart = new Button("Start");Button btStop = new Button("Stop");hBox.getChildren().addAll(btStart, btStop);hBox.setAlignment(Pos.CENTER);BorderPane borderPane = new BorderPane();borderPane.setCenter(clock);borderPane.setBottom(hBox);btStart.setOnMouseClicked(e ->{clock.start();});btStop.setOnMouseClicked(e ->{clock.stop();});Scene scene = new Scene(borderPane);primaryStage.setTitle("编程练习题15_32ClockPane");primaryStage.setScene(scene);primaryStage.show();}class ClockPane extends Pane{private int hour;private int minute;private int second;private double w = 250,h = 250;private EventHandler<ActionEvent> eventHandler = e -> setCurrentTime();private Timeline animation = new Timeline(new KeyFrame(Duration.millis(1000),eventHandler));public ClockPane() {setCurrentTime();animation.setCycleCount(Timeline.INDEFINITE);}public void stop() {animation.stop();}public void start() {animation.play();}public void setW(double w) {this.w = w;paintClock();}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);double sLength = clockRadius * 0.8;double sencondX = centerX + sLength * Math.sin(second * (2*Math.PI/60));double sencondY = centerY - sLength * Math.cos(second * (2*Math.PI/60));Line sLine = new Line(centerX, centerY, sencondX, sencondY);sLine.setStroke(Color.RED);double mLength = clockRadius * 0.65;double xMinute = 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, xMinute, 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.0) * (2*Math.PI / 12));Line hLine = new Line(centerX, centerY, hourX, hourY);hLine.setStroke(Color.GREEN);getChildren().clear();getChildren().addAll(circle, sLine, mLine, hLine);for(int i = -90;i < 270;i+=30) {double angle = Math.toRadians(i);double x = centerX-2 + (clockRadius-20) * Math.cos(angle); double y = centerY+3 + (clockRadius-20) * Math.sin(angle);double LineX = centerX-7 + (clockRadius-7) * Math.cos(angle); double LineY = centerY+4 + (clockRadius-7) * Math.sin(angle);int time = i/30+3;if(time == 0)time = 12;Text t = new Text(x,y,time+"");Text line = new Text(LineX,LineY,"—");line.setRotate(i);getChildren().add(t);getChildren().add(line);}for(int i = -90;i < 270;i+=6) {double angle = Math.toRadians(i);double LineX = centerX-3  + (clockRadius-3) * Math.cos(angle); double LineY = centerY+4.5 + (clockRadius-2.5) * Math.sin(angle);Text line = new Text(LineX,LineY,"-");line.setRotate(i);getChildren().add(line);}}
}	
public static void main(String[] args) { Application.launch(args); }}

这段代码实现了一个简易的时钟界面,该时钟可以显示当前的时间,并且可以通过按钮来启动和停止时钟的更新。下面是代码的详细解释:

  1. 主类和启动方法:

    • 类名为编程练习题15_32ClockPane,继承自Application类。
    • start方法用于启动JavaFX应用,并设置窗口、场景等。
  2. 内部类ClockPane:

    • ClockPane类是一个自定义的Pane,用于绘制时钟的各个部件。
    • 定义了一些成员变量,如hourminutesecond,用于存储当前的时间。
    • animation是一个Timeline对象,用于定时更新时钟的时间显示。
  3. 构造器:

    • 构造器中初始化了Timeline动画,并设置了无限循环。
  4. 方法说明:

    • setCurrentTime: 获取当前系统时间,并更新成员变量hourminutesecond
    • paintClock: 清除Pane上的内容,并重新绘制时钟。
    • stop: 停止Timeline动画。
    • start: 启动Timeline动画。
  5. 绘制时钟:

    • 首先清除Pane上的所有内容。
    • 绘制圆形背景circle,代表时钟的表盘。
    • 绘制秒针sLine、分针mLine和时针hLine
      • 秒针、分针和时针的位置是根据角度计算得出的,使用了三角函数。
      • 角度转换为弧度,因为Java中的Math.sinMath.cos函数接受弧度值。
      • 针的长度由clockRadius的百分比确定。
    • 添加数字和刻度线:
      • 每30度绘制一个较大的数字和对应的刻度线,表示小时。
      • 每6度绘制一个小的刻度线,表示分钟。
  6. 事件处理:

    • 通过EventHandler<ActionEvent>接口定义了一个事件处理器eventHandler,当动画的每一帧触发时会调用setCurrentTime方法来更新时间。
    • btStartbtStop按钮用于启动和停止动画。
  7. 场景设置:

    • 使用BorderPane布局来组织时钟界面和按钮。
    • BorderPane的中心区域放置ClockPane,底部放置包含btStartbtStop按钮的HBox
  8. 主方法:

    • 调用Application.launch(args)启动JavaFX应用。

这个程序实现了以下功能:

  • 显示当前时间。
  • 动态更新时间。
  • 提供按钮来启动和停止时间更新。
  • 时钟界面包括时针、分针、秒针、数字和刻度线。

运行这个程序时,会看到一个带有时钟和控制按钮的窗口。点击“Start”按钮后,时钟会动态更新显示的时间,点击“Stop”按钮则会停止更新。

结果展示 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3267016.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

CVE-2024-39700 (CVSS 9.9):JupyterLab 模板中存在严重漏洞

在广泛使用的 JupyterLab 扩展模板中发现了一个严重漏洞&#xff0c;编号为CVE-2024-39700 。此漏洞可能使攻击者能够在受影响的系统上远程执行代码&#xff0c;从而可能导致大范围入侵和数据泄露。 该漏洞源于在扩展创建过程中选择“测试”选项时自动生成“update-integratio…

blender顶点乱飞的问题解决

初学blender&#xff0c;编辑模式下移动某些顶点&#xff0c;不管是移动还是滑动都会出现定点乱飞的问题&#xff0c;后来才发现是开了吸附工具的原因&#xff01;&#xff01;&#xff01;&#xff01; 像下面这样&#xff0c;其实我只是在Z轴上移动&#xff0c;但是就跑的很…

AvaloniaUI的学习

相关网站 github:https://github.com/AvaloniaUI/Avalonia 官方中文文档&#xff1a;https://docs.avaloniaui.net/zh-Hans/docs/welcome IDE选择 VS2022VSCodeRider 以上三种我都尝试过&#xff0c;体验Rider最好。VS2022的提示功能不好&#xff0c;VSCode太慢&#xff0c…

调度器——DolphinScheduler讲解及安装教程

调度器——DolphinScheduler讲解及安装教程 一&#xff1a;基本讲解 Dolphin Scheduler 1、开源的分布式任务调度系统 2、支持多种任务类型&#xff0c;包括Shell、Spark、Hive等 3、灵活的任务调度功能和友好的Web界面&#xff0c;方便管理和监控任务的执行情况 架构 操作系…

必备神器!三款优秀远程控制电脑软件推荐

嘿&#xff0c;各位职场小伙伴们&#xff0c;今儿个咱们来聊聊个挺实用又带点“科技范儿”的话题——电脑远程控制那点事儿。作为刚踏入职场不久的新人&#xff0c;我深刻体会到&#xff0c;在这信息爆炸的时代&#xff0c;掌握几招远程操作的技能&#xff0c;简直就是给自个儿…

一文详解 JuiceFS 读性能:预读、预取、缓存、FUSE 和对象存储

在高性能计算场景中&#xff0c;往往采用全闪存架构和内核态并行文件系统&#xff0c;以满足性能要求。随着数据规模的增加和分布式系统集群规模的增加&#xff0c;全闪存的高成本和内核客户端的运维复杂性成为主要挑战。 JuiceFS&#xff0c;是一款全用户态的云原生分布式文件…

GPU虚拟化和池化技术解读

GPU虚拟化到池化技术深度分析 在大型模型的推动下&#xff0c;GPU算力的需求日益增长。然而&#xff0c;企业常常受限于有限的GPU卡资源&#xff0c;即使采用虚拟化技术&#xff0c;也难以充分利用或持续使用这些资源。为解决GPU算力资源的不均衡问题&#xff0c;同时推动国产…

Spring源码学习笔记之@Async源码

文章目录 一、简介二、异步任务Async的使用方法2.1、第一步、配置类上加EnableAsync注解2.2、第二步、自定义线程池2.2.1、方法一、不配置自定义线程池使用默认线程池2.2.2、方法二、使用AsyncConfigurer指定线程池2.2.3、方法三、使用自定义的线程池Excutor2.2.4、方法四、使用…

《500 Lines or Less》(5)异步爬虫

https://aosabook.org/en/500L/a-web-crawler-with-asyncio-coroutines.html ——A. Jesse Jiryu Davis and Guido van Rossum 介绍 网络程序消耗的不是计算资源&#xff0c;而是打开许多缓慢的连接&#xff0c;解决此问题的现代方法是异步IO。 本章介绍一个简单的网络爬虫&a…

【Linux】玩转操作系统,深入刨析进程状态与调度机制

目录 1. 进程排队2. 进程状态的表述2.1. 进程状态2.2 运行状态2.3. 阻塞状态2.4. 挂起状态 3. Linux下具体的进程状态3.1. 运行状态R3.2. 可中断睡眠状态S3.3. 不可中断睡眠状态D3.4. 停止状态T3.5. 死亡状态X3.6. 僵尸状态Z 4. 孤儿进程5. 优先级6. Linux的调度与切换6.1. 四个…

单链表的实现和操作

目录 一.前言 二.单链表的定义和结构 三. 单链表的操作 一.前言 线性表的链式表示又称为非顺序映像或链式映像。简而言之&#xff0c;链表可以理解为由指针链连接的n个结点组成的。其中每一个结点包括数据域和指针域。值得注意的是&#xff0c;与顺序表不同&#xff0c;链表中…

手写spring简易版本,让你更好理解spring源码

首先我们要模拟spring&#xff0c;先搞配置文件&#xff0c;并配置bean 创建我们需要的类&#xff0c;beandefito&#xff0c;这个类是用来装解析后的bean&#xff0c;主要三个字段&#xff0c;id&#xff0c;class&#xff0c;scop&#xff0c;对应xml配置的属性 package org…

安科瑞邀您走进2024北京电气设计第44届年会

2024年7月11日&#xff0c;2024建筑电气高峰论坛暨北京电气设计第44届年会在京如期而至&#xff0c;各路精英齐聚一堂&#xff0c;围绕智慧建筑、数据中心、工业厂房配电、储能技术等热点问题展开讨论。安科瑞携企业微电网智慧能源的一站式服务解决方案亮相盛会&#xff0c;尽享…

ssh出现Permission denied(publickey,gssapi-keyex,gssapi-with-mic).

目录 1.报错如下 ​编辑2.编辑sshd配置文件 ​编辑3.解决报错 &#x1f310; 无论你是初学者还是经验丰富的专家&#xff0c;都能在这里找到志同道合的朋友&#xff0c;一起进步&#xff0c;共同探索运维领域的各种挑战和机遇。 1.报错如下 2.编辑sshd配置文件 vim /etc/ss…

【安全规范】软件开发安全设计指南(Word文档)

2.1.应用系统架构安全设计要求 2.2.应用系统软件功能安全设计要求 2.3.应用系统存储安全设计要求 2.4.应用系统通讯安全设计要求 2.5.应用系统数据库安全设计要求 2.6.应用系统数据安全设计要求 软件全套精华资料包清单部分文件列表&#xff1a; 工作安排任务书&#xff0c;可行…

PEFT LoRA 介绍(LoRA微调使用的参数及方法)

一 PEFT LoRA 介绍 官网简介如下图&#xff1a; 翻译过来是&#xff1a;低秩自适应(LoRA)是一种PEFT方法&#xff0c;它将一个大矩阵在注意层分解成两个较小的低秩矩阵。这大大减少了需要微调的参数数量。 说的只是针对注意力层&#xff0c;其实我自己平时微调操作注意力层多…

vue3前端开发-小兔鲜项目-登录和非登录状态下的模板适配

vue3前端开发-小兔鲜项目-登录和非登录状态下的模板适配&#xff01;有了上次的内容铺垫&#xff0c;我们可以根据用户的token来判定&#xff0c;到底是显示什么内容了。 1&#xff1a;我们在对应的导航组件内修改完善一下内容即可。 <script setup> import { useUserSt…

Mysql或MariaDB数据库的用户与授权操作——实操保姆级教程

一、问题描述 在日常的工作中,我们需要给不同角色的人员创建不同的账号,他们各自可访问的数据库或权限不一样,这时就需要创建用户和赋予不同的权限内容了。 二、问题分析 1、创建不同的角色账号; 2、给这些账号授予各自可访问数据库的权限。 三、实现方法 Centos8安装…

CHIP第三章作业

一&#xff0c;实验拓扑 二&#xff0c;实验要求 1、R5为ISP&#xff0c;只能进行Ip地址配置&#xff0c;其所有地址均配为公有IP地址; 2、R1和R5间使用PPP的PAP认证&#xff0c;R5为主认证方; R2与R5之间使用ppp的cHAP认证&#xff0c;R5为主认证方; R3与R5之间使用HDLC封装; …

数据结构--单链表代码(王道书上代码手敲!!!)c++

目录 1.带头结点的初始化以及检查单链表是否为空 2.不带头结点的单链表初始化以及表是否为空检查 3.带头结点按位序插入 4.不带头结点的按位序插入 5.带头结点的后插&#xff0c;前插&#xff0c;按位删除&#xff0c;删除固定节点操作 6 不带头结点的后插&#xff0c;前…