JavaFx是开发Java GUI程序的新框架。JavaFX应用可以无缝地在桌面或web浏览器中运行。具有内建的2D、3D动画支持,以及视频和音频的回放功能,可以作为一个应用独立运行或者在浏览器中运行。

ClockPane类:

import javafx.scene.shape.Circle;
import javafx.scene.shape.Line;
import javafx.scene.text.Text;
import javafx.scene.control.Label;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
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 int getMinute() {
return minute;
} //返回秒钟
public int getSecond() {
return second;
} //设置一个新的小时
public void setHour(int hour) {
this.hour = hour;
paintClock();
} //设置一个新的分钟
public void setMinute(int minute) {
this.minute = minute;
paintClock();
} //设置一个新的秒钟
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();
} public void paintClock() {
//初始化时钟参数
double clockRadius = Math.min(w, h) * 0.8 * 0.5;
double centerX = w / 2;
double centerY = h / 2; //显示当前时间,并设置时间显示的位置
String timeString = hour + ":" + minute + ":" + second;
Label labelCurrentTime = new Label(timeString);
labelCurrentTime.setLayoutX(centerX - 25);
labelCurrentTime.setLayoutY(centerY + clockRadius + 5); //画圆
Circle circle = new Circle(centerX, centerY, clockRadius);
//circle.setFill(Color.WHITE);
//circle.setStroke(Color.BLACK);
circle.setStyle("-fx-stroke: black; -fx-fill: white");
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 + 5, "3");
Text t4 = new Text(centerX - 3, centerY + clockRadius - 3, "6"); //画秒针
double sLength = clockRadius * 0.8; //设置秒针的长度
double secondX = centerX + sLength * Math.sin(second * (2 * Math.PI / 60.0));
double secondY = centerY - sLength * Math.cos(second * (2 * Math.PI / 60.0));
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.0);
double minuteY = centerY - mLength * Math.cos(minute * 2 * Math.PI / 60.0);
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.0) * 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, labelCurrentTime);
} }

显示时钟程序:

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.stage.Stage;
import javafx.util.Duration; public class ClockAniamtion extends Application{ @Override
public void start(Stage primaryStage) throws Exception {
ClockPane clock = new ClockPane(); //将clock放在pane里
BorderPane pane = new BorderPane();
pane.setCenter(clock); //创建一个handler
EventHandler<ActionEvent> eventHandler = e -> {
clock.setCurrentTime();
}; Timeline animation = new Timeline(
new KeyFrame(Duration.millis(1000), eventHandler));
animation.setCycleCount(Timeline.INDEFINITE);
animation.play(); Scene scene= new Scene(pane, 250, 250);
primaryStage.setTitle("时钟");
primaryStage.setScene(scene);
primaryStage.show(); //让clock跟随窗口的变化而变化
pane.widthProperty().addListener(ov -> clock.setW(pane.getWidth()));
pane.heightProperty().addListener(ov -> clock.setH(pane.getHeight()));
} public static void main(String[] args) {
Application.launch(args);
} }

Java-javaFx库运用-时钟显示的更多相关文章

  1. GitHub上那些值得一试的JAVA开源库--转

    原文地址:http://www.jianshu.com/p/ad40e6dd3789 作为一名程序员,你几乎每天都会使用到GitHub上的那些著名Java第三方库,比如Apache Commons,S ...

  2. GitHub上那些值得一试的JAVA开源库

    作为一名程序员,你几乎每天都会使用到GitHub上的那些著名Java第三方库,比如Apache Commons,Spring,Hibernate等等.除了这些,你可能还会fork或Star一些其他的开 ...

  3. Android消息机制——时钟显示和异步处理工具类(AsyncTask)

    1. 时钟显示 定义布局文件——activity_my_analog_clock_thread_demo.xml <?xml version="1.0" encoding=& ...

  4. mysql 的 java 连接库

    mysql 的 java 连接库 解压缩mysql-connector-java-5.1.30.zip 将要使用的是mysql-connector-java-5.1.30-bin-g.jar和mysq ...

  5. [java代码库]-简易计算器(第二种)

    [java代码库]-简易计算器(第二种) 第二种方案:在程序中不使用if/switch……case等语句,完成计算器功能. <html> <head> <title> ...

  6. 网络爬虫技术实现java依赖库整理输出

    网络爬虫技术实现java依赖库整理输出 目录 1       简介... 2 1.1      背景介绍... 2 1.2      现有方法优缺点对比... 2 2       实现方法... 2 ...

  7. 【转载】Java密钥库及keytool使用详解

    ---------------- 版权声明:本文为CSDN博主「adrninistrat0r」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明. 原文链接:https: ...

  8. java 标签库(核心,xml,sql ,国际化,函数)

    java标签库分分为上述几种,一般经常使用的是核心和函数,接下来会分别讲解这几种,和常见的用法. 一般标签库会和el表达式一起使用,所以在学习标签库前最后也学习下el表达式的使用. 导入后展开 可以从 ...

  9. 【Jetlang】一个高性能的Java线程库

    actor  Jetlang 提供了一个高性能的Java线程库,该库是 JDK 1.5 中的 java.util.concurrent 包的补充,可用于基于并发消息机制的应用. .net的MS CCR ...

随机推荐

  1. php常用函数总结2

    文件系统函数 函数名 描述 实例 输入 输出 操作 fopen() 打开文件或者 URL $handle = fopen("ftp://user:password@example.com/s ...

  2. Minimum Snap轨迹规划详解(3)闭式求解

    如果QP问题只有等式约束没有不等式约束,那么是可以闭式求解(close form)的.闭式求解效率要快很多,而且只需要用到矩阵运算,不需要QPsolver. 这里介绍Nicholas Roy文章中闭式 ...

  3. 笨办法学Python记录--习题37 异常,lambda,yield,转义序列

    习题中提到了raise,查了下,顺便所有异常类关键字罗列如下文章中: 为什么使用异常 错误处理.事件通知.特殊情况处理.退出时的行为.不正常的程序流程. 简单的示例 在没有任何定义x变量的时候: pr ...

  4. 剑指offer——数组中出现次数超过一半的数字(c++)

    题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.如 ...

  5. The method setPositiveButton(int, DialogInterface.OnClickListener) in the type AlertDialog.Builder i

    参考资料: http://blog.csdn.net/competerh_programing/article/details/7377950 在创建Dialog的时候,出现: The method ...

  6. 为什么 Go 语言把类型放在后面

    不是为了与众不同.而是为了更加清晰易懂. Rob Pike 曾经在 Go 官方博客解释过这个问题(原文地址:http://blog.golang.org/gos-declaration-syntax) ...

  7. Django--实现分页功能,并且基于cookie实现用户定制每页的数据条数

    # page_num 当前页数, total_result_num 总共有多少条测试结果 def pagination(request, page_num, total_result_num, res ...

  8. HTML中margin和padding的区别

    我们以DIV为一个盒子例子,既然和显示生活中的盒子一样,那我们想一下,生活中的盒子 内部是不是空的好用来存放东西,而里面存放东西的区域我们给他起个名字叫“content(内 容)”,而盒子的纸壁给他起 ...

  9. LightOJ 1203 Guarding Bananas (凸包最小顶角)

    题目链接:LightOJ 1203 Problem Description Once there was a lazy monkey in a forest. But he loved banana ...

  10. springMvc请求路径解析

    一开始我的代码是: //index.jsp<%@ page contentType="text/html;charset=UTF-8" language="java ...