Java语言程序设计基础篇_编程练习题*16.7 (设置时钟的时间)

news2024/12/27 14:30:01
*16.7 (设置时钟的时间)

    编写一个程序,显示一个时钟,并通过在三个文本域中输入小时、分钟和秒 钟来设置时钟的时间,如图16-38b 所示。使用程序清单14-21的ClockPane改变时钟大小使其居于面板中央

  • 习题思路
  1. 实例化一个ClockPane(在程序清单14_21),创建一个HBox布局
  2. 新建三个Label和三个TextField,添加到HBox布局中
  3. 为三个TextField分别注册一个键盘事件,当在输入框中按下Enter键且内容不为空时, 调用ClockPane的设置时间的方法(如clockPane.setHour(hour))
  4. 创建一个BorderPane,把ClockPane设置在中心,把HBox设置在底部
  5. 创建Scene并运行代码
  •  代码示例

 编程练习题16_7SetClockTime.java

package chapter_16;

import chapter_14.程序清单14_21ClockPane;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

public class 编程练习题16_7SetClockTime extends Application{
	@Override
	public void start(Stage primaryStage) throws Exception {
		程序清单14_21ClockPane clockPane = new 程序清单14_21ClockPane();
		
		HBox hBox = new HBox(5);
		hBox.setPadding(new Insets(5, 5, 5, 5));
		hBox.setAlignment(Pos.CENTER);
		Label lbHour = new Label("Hour");
		TextField tfHour = new TextField();
		Label lbMinute = new Label("Minute");
		TextField tfMinute = new TextField();
		Label lbSecond = new Label("Second");
		TextField tfSecond = new TextField();
		tfHour.setPrefWidth(40);
		tfMinute.setPrefWidth(40);
		tfSecond.setPrefWidth(40);
		hBox.getChildren().addAll(lbHour,tfHour, lbMinute,tfMinute, lbSecond,tfSecond);
		
		tfHour.setOnKeyPressed(e ->{
			if(e.getCode() == KeyCode.ENTER&&tfHour.getText()!="") {
				int hour = Integer.parseInt(tfHour.getText());
				clockPane.setHour(hour);
			}
		});
		tfMinute.setOnKeyPressed(e ->{
			if(e.getCode() == KeyCode.ENTER&&tfMinute.getText()!="") {
				int minute = Integer.parseInt(tfMinute.getText());
				clockPane.setMinute(minute);
			}
		});
		tfSecond.setOnKeyPressed(e ->{
			if(e.getCode() == KeyCode.ENTER&&tfSecond.getText()!="") {
				int second = Integer.parseInt(tfSecond.getText());
				clockPane.setSecond(second);
			}
		});
		
		BorderPane borderPane = new BorderPane();
		borderPane.setCenter(clockPane);
		borderPane.setBottom(hBox);
		
		Scene scene = new Scene(borderPane,268, 300);
		primaryStage.setTitle("编程练习题16_7SetClockTime");
		primaryStage.setScene(scene);
		primaryStage.show();
	}
	public static void main(String[] args) {
		Application.launch(args);
	}
}

程序清单14_21ClockPane.java 

package chapter_14;

import java.util.Calendar;
import java.util.GregorianCalendar;


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;

public class 程序清单14_21ClockPane extends Pane{
	private int hour;
	private int minute;
	private int second;
	private boolean hourHandVisible = true;
	private boolean minuteHandVisible = true;
	private boolean secondHandVisible = true;
	
	
	private double w = 250,h = 250;
	public 程序清单14_21ClockPane() {
		setCurrentTime();
	}
	public 程序清单14_21ClockPane(int hour) {
		this.hour = hour;
		minute = 0;
		paintClock();
	}
	public 程序清单14_21ClockPane(int hour, int minute) {
		this.hour = hour;
		this.minute = minute;
		second = 0;
		paintClock();
	}
	public 程序清单14_21ClockPane(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 boolean getHourHandVisible() {
		return hourHandVisible;
	}
	public boolean getMinuteHandVisible() {
		return minuteHandVisible;
	}
	public boolean getSecondHandVisible() {
		return secondHandVisible;
	}
	public void setHourHandVisible(boolean hourHandVisible) {
		this.hourHandVisible = hourHandVisible;
		paintClock();
	}
	public void setMinuteHandVisible(boolean minuteHandVisible) {
		this.minuteHandVisible = minuteHandVisible;
		paintClock();
	}
	public void setSecondHandVisible(boolean secondHandVisible) {
		this.secondHandVisible = secondHandVisible;
		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().add(circle);
		
		if(getHourHandVisible()==true) {
			getChildren().add(hLine);
		}
		if (getMinuteHandVisible()==true) { 
			getChildren().add(mLine);
		}
		if(getSecondHandVisible()==true) {
			getChildren().add(sLine);
		}
		
		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);
			
		}
	}
}
  • 结果展示

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

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

相关文章

【网络安全渗透测试零基础入门必知必会】之什么是文件包含漏洞分类(非常详细)零基础入门到精通,收藏这一篇就够了

一、前言 这是大白给粉丝盆友们整理的网络安全渗透测试入门阶段文件包含渗透与防御第1篇。 本文主要讲解什么是文件包含漏洞、本地文件包含漏洞 喜欢的朋友们&#xff0c;记得给大白点赞支持和收藏一下&#xff0c;关注我&#xff0c;学习黑客技术。 一、什么是文件包含漏洞…

the request was rejected because no multipart boundary was found

文章目录 1. 需求描述2. 报错信息3. 探索过程1. 使用postman 排除后端错误2. 搜索网上的解决方法3. 解决方法 1. 需求描述 想要在前端上传一个PDF 发票&#xff0c;经过后端解析PDF之后&#xff0c;将想要的值自动回填到对应的输入框中 2. 报错信息 org.apache.tomcat.util.…

VSCode远程调试Linux程序

VS 安装CodeRunner插件 菜单→添加配置→lunch.json中设置如下&#xff1a; program填入要调试的文件 {"version": "0.2.0","configurations": [{"name": "gdb renderPng","type": "cppdbg","re…

为什么某央企可以抓到红队攻击,而你不行?

国家HVV行动从2016年到2024年已经是第9年了&#xff0c;HVV行动目的就是保卫国家关键基础设施的网络安全行动&#xff0c;更是一场实战化的网络攻击与防御实战&#xff0c;这些年来红队攻击手段层出不穷&#xff0c;最为典型的就是 0/N Day、弱口令、社工钓鱼等&#xff0c;也极…

北京青蓝智慧科技ITSS服务经理:长安链ChainBridge“链桥”问世 加速国家级区块链网络互联互通

8月5日&#xff0c;据国家区块链技术创新中心消息&#xff0c;我国首个完全自主控制的区块链软硬件技术系统——长安链&#xff0c;正式推出了全场景技术平台ChainBridge“链桥”。 此平台能够支持所有异构和同构的区块链进行协作&#xff0c;满足跨领域、跨地域、跨行业及跨层…

用Java手写jvm之模拟方法调用指令invokexxx和方法返回指令xreturn

写在前面 源码 。 本文一起看下方法调用相关的指令invokexxx以及方法返回&#xff08;栈帧弹出线程栈&#xff09;相关的指令xReturn 。 1&#xff1a;正文 因为invokexxx指令和普通的指令不同&#xff0c;会创建一个新的栈帧&#xff0c;并压倒操作数栈中&#xff0c;所以我…

《黑神话:悟空》在PS5上优化得不错 能达到2K/60帧

《黑神话&#xff1a;悟空》是今年最受玩家期待的游戏之一&#xff0c;但许多粉丝担心该作优化不佳&#xff0c;因为其使用的是虚幻5引擎。虚幻5引擎会导致性能问题出现&#xff0c;游戏 科学的新作也将面临同样问题。但有新报告称&#xff0c;《黑神话》PS5版优化得相当不错&a…

UE 后期处理

UE4后期处理材质的一些应用&#xff08;上&#xff09; - 哔哩哔哩 (bilibili.com) UE4后期处理材质的一些应用&#xff08;下&#xff09; - 哔哩哔哩 (bilibili.com) 后期处理材质的作用 后期处理材质使您能够设置与后期处理一起使用的材质&#xff0c;以创建破坏的视觉屏幕…

免费【2024】springboot 二手图书交易系统的设计与实现

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

PyCharm找不到Python了咋办

Python发生了重装的&#xff0c;且新的路径和原有路径不同&#xff0c;就会出现如下的错误&#xff1a; 解决办法&#xff1a; 点开PyCharm菜单的File/Setting 然后&#xff1a; 有上图的提示&#xff0c;说明需要将原来的venv进行清空。 如此操作之后&#xff0c;原来的红色…

交通预测数据文件梳理:PEMS04

文章目录 前言一、PEMS04.csv文件二、adj_PEMS04.pkl文件三、adj_PEMS04_distance.pkl文件四、PEMS04.npz文件 前言 最近做的实验比较多&#xff0c;对于交通预测数据的各种文件和文件中的数据格式理解愈加混乱&#xff0c;因此打算重新做一遍梳理来加深实验数据集的理解&…

【矩阵对角线求和】求一个3*3矩阵对角线元素之和

求一个3*3矩阵对角线元素之和&#xff0c;使用C语言实现 具体代码&#xff1a; #include<stdio.h>int main(){float a[3][3],sum0;printf("请输入3x3矩阵的元素&#xff08;按行输入&#xff09;&#xff1a;\n");for(int i0;i<3;i){for(int j0;j<3;j)…

AD 飞线显示混乱、错位

执行Design->Netlist->Update Free Primitives From Componet Pads

8月6(信息差)

&#x1f30d;华为最便宜小折叠&#xff01;华为nova Flip今晚发布&#xff1a;搭载麒麟8000芯片 从曝光的跑分信息来看&#xff0c;nova Flip将搭载麒麟8000处理器&#xff0c;也就是nova 12 Pro/Ultra的同款&#xff0c;采用8核心的134组合&#xff0c;大核是1颗2.4GHz的Cor…

如何用ai来完成数据库分析(1)

前言 因一些课程设计要写长篇分析报告&#xff0c;这里借用ai做一篇指导教程&#xff0c;分上下两篇。这篇也会教如何让ai给你你想要的答案&#xff0c;众所周知&#xff0c;现在的ai并不智能&#xff0c;不针对各类厂家&#xff0c;但是放出来的确实表象如此。 但其实问法决…

SAP ABAP代码模板CLASS

此模板也使用OO ALV,创建新程序简单&#xff0c;功能包装独立&#xff0c;用到一个独立的CLASS. 1.ALV类 class ZCL_CM_GUI_ALV definitionpublicfinalcreate public .public section.data REPID type SYREPID .data DYNNR type SYDYNNR .data TOOLBAR type CHAR30 .data USE…

Linux中的进程替换

一、理解进程替换 首先&#xff0c;exec* 系列函数能让进程执行新程序&#xff0c;上图我们用到的是 int execl(const char* path, const char* arg, ...)函数&#xff0c;所以相当于执行了 ls -la 指令&#xff0c;这就完成了进程的替换。 本来子进程中存放的是父进程的代码和…

5. 有效的括号

5. 有效的括号 题目题目分析 题目 题目分析 一个很标准的关于栈知识点的应用&#xff0c;首先先初始化一个栈&#xff0c;再遍历字符串s,当匹配到为左边字符串是将其压入栈中&#xff0c;遇到右边字符串时要判断此时的栈顶元素是否与其匹配&#xff0c;若匹配则将栈顶元素弹出&…

GPX格式详解,javascript写入读取GPX示例

还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#xff0c;webgl&#xff0c;ech…

如何使用Markdown编辑器

欢迎使用Markdown编辑器 你好&#xff01; 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章&#xff0c;了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持&#x…