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

yizhihongxing

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实现的微信公众号获取微信用户信息示例的完整攻略包括以下步骤: 1. 注册微信公众号 首先需要在微信公众平台注册一个账号,然后将其认证为企业号或服务号,才能使用微信公众平台提供的API进行开发。 2. 配置公众号信息 在注册并认证好微信公众号之后,需要对其进行一些配置。首先,需要在“开发者中心”菜单中配置服务器URL和Token。将URL和Token填…

    Java 2023年5月23日
    00
  • java控制台实现可视化日历小程序

    下面我将详细讲解“Java控制台实现可视化日历小程序”的完整攻略。 1. 程序开发环境准备 首先,我们需要安装Java JDK。建议安装1.8及以上版本。 安装完成后,我们新建一个Java控制台项目,在项目中新建一个Main类,并在该类中进行编码实现。 2. 实现获取指定年月的日历数据 在Java中,可以通过java.util.Calendar和java.u…

    Java 2023年5月20日
    00
  • Java的IO流实现文件和文件夹的复制

    Java中的IO流可以实现文件和文件夹的复制,下面是实现这个过程的完整攻略: 1. 复制文件 1.1 创建文件输入流和文件输出流 在Java中,文件的复制过程可以通过创建文件输入流和文件输出流实现。可以使用Java IO的File类提供的构造函数来打开文件输入流和输出流,然后使用缓冲区逐个字节的复制文件内容。 示例代码: File inputFile = n…

    Java 2023年5月19日
    00
  • java 两个数组合并的几种方法

    Java两个数组合并的几种方法 介绍 在Java中,有时候需要将两个数组合并成一个数组。本文将介绍Java中合并两个数组的几种方法。 方法一:使用for循环 首先,我们可以使用for循环来合并两个数组。具体的操作是,将第一个数组的元素复制到新的数组中,然后将第二个数组的元素复制到新的数组中。 示例代码: public static int[] mergeAr…

    Java 2023年5月27日
    00
  • Java实现上传和下载功能(支持多个文件同时上传)

    下面我将为你详细讲解Java如何实现上传和下载功能,同时支持多个文件的同时上传。 1. 实现上传功能 1.1 前端页面设计 首先,在前端页面中需要有一个表单,用于选择要上传的文件,并将文件提交到后台。以下是一个简单的HTML代码示例: <form enctype="multipart/form-data" method="…

    Java 2023年6月15日
    00
  • Java 数组高频考点分析讲解

    Java 数组高频考点分析讲解 数组是Java中非常重要的数据类型,经常被用于开发过程中。下面我们来详细讲解Java数组的高频考点,以帮助读者更好地掌握数组的使用。 数组概述 数组是一种存储同类型元素的数据结构,它是在程序中声明的一个固定大小的、连续存储的元素集合。在Java中,数组是一个对象,由一块连续的内存空间组成,可以存储多个相同数据类型的元素。 数组…

    Java 2023年5月26日
    00
  • SpringMVC 使用JSR-303进行校验 @Valid示例

    下面是 SpringMVC 使用 JSR-303 进行校验的完整攻略: 1. 添加依赖 在 pom.xml 添加如下依赖: <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId&…

    Java 2023年6月15日
    00
  • Java认证授权的作用是什么?

    Java认证授权是指对于Java Web应用程序,通过认证和授权机制来限制用户对应用程序资源的访问。在Java Web应用程序中,认证授权常常用于提供安全的身份验证和授权机制,保护应用程序数据资源的安全性,防止未授权用户的非法访问。 具体来说,Java认证授权的作用包括: 确认用户身份:Java认证授权可以通过用户提供的凭证(例如用户名和密码)来确认用户身份…

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