JavaFX实现简易时钟效果(一)

JavaFX实现简易时钟效果(一)》是一篇针对 JavaFX 初学者的教程。通过这篇文章,您将学会如何使用 JavaFX 的相关类和 API,实现一个简单的时钟效果。

首先,我们需要创建一个 JavaFX 项目。在项目的主界面上创建一个 VBox,用于放置时钟和控制按钮。然后在 VBox 中放置一个 Label 控件,用于显示当前的时间。接着,在应用程序的主类中编写以下代码:

import java.text.SimpleDateFormat;
import java.util.Calendar;
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.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.Duration;

public class ClockDemo extends Application {

    private Label label = new Label();
    private Button controlButton = new Button("Start");

    @Override
    public void start(Stage primaryStage) throws Exception {
        VBox box = new VBox();
        box.setSpacing(10);
        box.getChildren().addAll(label, controlButton);
        Scene scene = new Scene(box, 200, 100);
        primaryStage.setScene(scene);
        primaryStage.show();

        Timeline timeline = new Timeline(
            new KeyFrame(Duration.seconds(1), new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent event) {
                    Calendar calendar = Calendar.getInstance();
                    SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
                    label.setText(sdf.format(calendar.getTime()));
                }
            })
        );
        timeline.setCycleCount(Timeline.INDEFINITE);

        controlButton.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                if (timeline.getStatus() == Timeline.Status.RUNNING) {
                    timeline.pause();
                    controlButton.setText("Start");
                } else {
                    timeline.play();
                    controlButton.setText("Pause");
                }
            }
        });
    }

    public static void main(String[] args) {
        launch(args);
    }
}

上述代码中,我们定义了一个 VBox,其中包含一个 Label 和一个 Button。Label 用于显示当前时间,Button 用于控制时钟的运行状态。

我们通过创建一个 Timeline 对象,并设置其周期性执行的 KeyFrame,来实现时钟的计时功能。在 KeyFrame 的回调函数中,获取当前的时间并格式化为“HH:mm:ss”的形式,然后将其设置到 Label 控件上。

我们为 Button 设置了一个点击事件的监听器。当用户点击 Button 时,判断 Timeline 的状态,如果正在运行,就暂停 Timeline 并将按钮文本设置为“Start”,否则就启动 Timeline 并将按钮文本设置为“Pause”。

这样,我们就实现了一个简单的时钟效果。用户可以通过按钮控制时钟的启停,时钟的显示格式为“HH:mm:ss”。

下面提供一些示例代码,用于演示时间格式的更改和时钟指针的绘制:

  • 修改时间格式为“yyyy-MM-dd HH:mm:ss”
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  • 绘制时钟指针
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;

// ...

private Canvas canvas = new Canvas(200, 200);

// ...

GraphicsContext gc = canvas.getGraphicsContext2D();
double canvasWidth = canvas.getWidth();
double canvasHeight = canvas.getHeight();
double centerX = canvasWidth / 2;
double centerY = canvasHeight / 2;
double radius = 80;

for (int i = 0; i < 12; i++) {
    double angle = i * Math.PI / 6;
    double x = centerX + Math.sin(angle) * radius;
    double y = centerY - Math.cos(angle) * radius;
    if (i == 0) {
        gc.fillText("12", x - 5, y + 5);
    } else {
        gc.fillText(Integer.toString(i), x - 2, y + 3);
    }
}

Calendar calendar = Calendar.getInstance();
double second = calendar.get(Calendar.SECOND);
double minute = calendar.get(Calendar.MINUTE);
double hour = calendar.get(Calendar.HOUR) + minute / 60.0;
double hourAngle = (hour * Math.PI / 6) - (Math.PI / 2);
double minuteAngle = (minute * Math.PI / 30) - (Math.PI / 2);
double secondAngle = (second * Math.PI / 30) - (Math.PI / 2);

gc.setStroke(Color.RED);
gc.setLineWidth(1);
gc.strokeLine(centerX, centerY, centerX + Math.sin(hourAngle) * (radius * 0.5), centerY - Math.cos(hourAngle) * (radius * 0.5));

gc.setStroke(Color.BLACK);
gc.setLineWidth(1);
gc.strokeLine(centerX, centerY, centerX + Math.sin(minuteAngle) * (radius * 0.7), centerY - Math.cos(minuteAngle) * (radius * 0.7));

gc.setStroke(Color.GREEN);
gc.setLineWidth(1);
gc.strokeLine(centerX, centerY, centerX + Math.sin(secondAngle) * (radius * 0.9), centerY - Math.cos(secondAngle) * (radius * 0.9));

以上代码中,我们使用 Canvas 组件创建一个可以画图的画布,然后通过 GraphicsContext 组件的 setStroke() 和 setLineWidth() 方法设置时钟指针的颜色和粗细。最后,在画布中绘制时钟指针即可。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaFX实现简易时钟效果(一) - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Java访问修饰符原理及代码解析

    《Java访问修饰符原理及代码解析》 概述 Java中通过访问修饰符来限定类成员的访问范围,保证了程序的安全性和可读性。Java中一共有四种访问修饰符:public、protected、default、private,其中默认访问修饰符是default。本篇攻略将会详细解释Java访问修饰符原理,并提供代码示例。 public public访问修饰符表示在任…

    Java 2023年5月30日
    00
  • Java读取Properties文件的七种方法的总结

    下面我将为你详细讲解Java读取Properties文件的七种方法的总结。 什么是Properties文件 Properties是一个文件格式,用于表示一些配置信息,形如key=value的形式。 例如,在Java的Spring框架中,会使用application.properties文件进行应用程序的一些配置。其中可以包含数据库配置、服务器端口号、系统环境…

    Java 2023年5月19日
    00
  • 5分钟快速上手Spring Boot

    5分钟快速上手Spring Boot 简介 Spring Boot是一个快速开发框架,可以让开发者快速地创建基于Spring的应用程序。通过集成常用的组件和框架,Spring Boot减少了许多繁琐的配置和集成操作,使得开发者可以专注于业务逻辑的实现。 步骤 步骤一:创建一个Spring Boot项目 在Spring Initializr网站中,配置你的项目…

    Java 2023年6月15日
    00
  • Spring整合Dubbo框架过程及原理解析

    下面是关于“Spring整合Dubbo框架过程及原理解析”的完整攻略: 1. Dubbo框架简介 Dubbo是一款开源的、高性能的Java RPC框架。Dubbo提供了完整的服务治理方案,包括服务注册与发现、服务路由、负载均衡、容错机制等。Dubbo的核心是基于高效的序列化与网络通信框架实现的高性能远程过程调用(RPC)。 2. Spring整合Dubbo …

    Java 2023年5月19日
    00
  • 将一个数组按照固定大小进行拆分成数组的方法

    将一个数组按照固定大小进行拆分成数组,可以通过循环和数组切片的操作来实现。具体步骤如下: 定义数组和切片变量 首先需要定义一个待拆分的数组和一个空的切片变量来存储拆分后的数组。 arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] split_size = 3 result = [] 本示例中待拆分的数组是arr,拆分后的每个子数组大小…

    Java 2023年5月26日
    00
  • Java中的字节,字符输出流与字节和字符输入流的简单理解

    Java中的 IO 流可以分为字节流和字符流。字节流以字节(8 位二进制数)为单位,而字符流以字符为单位,每个字符包含若干个字节。Java 中字符采用 Unicode 编码,每个字符占 2 个字节。 在 Java 中,字节输出流有两个主要的类:OutputStream 和 FileOutputStream。OutputStream 是字节输出流的抽象基类,可…

    Java 2023年5月26日
    00
  • Java实现联系人管理系统

    Java实现联系人管理系统完整攻略 系统简介 联系人管理系统,是一个用于管理个人或组织内部联系人的工具。一般包含添加联系人、编辑联系人、删除联系人、查看联系人等功能。本文介绍如何使用Java语言实现一个简单的联系人管理系统。 开发环境 JDK 8 Eclipse 或者 IntelliJ IDEA Tomcat 7 MySQL 5.7 所需技术 Servlet…

    Java 2023年5月30日
    00
  • java加密枝术深入理解

    Java加密技术深入理解 什么是加密? 加密是指将明文(原始数据)加工处理成一段无法破解的密文的过程。通过加密,可以确保数据在传输或存储过程中的安全性,防止数据泄露或被非法篡改。 加密的分类 加密可以根据密钥是否相同,分为对称加密和非对称加密。 对称加密 对称加密是指加密和解密都使用相同的密钥。对称加密的优点是加密解密速度快,适用于对大量数据进行加密。常见的…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部