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日

相关文章

  • 详解hibernate双向多对多关联映射XML与注解版

    关于“详解hibernate双向多对多关联映射XML与注解版”的攻略,我将从以下几个方面进行详细讲解: 双向多对多关联映射的概念与要素 Hibernate双向多对多关联映射XML版的实现步骤及示例 Hibernate双向多对多关联映射注解版的实现步骤及示例 接下来我会一一进行详细讲解。 一、双向多对多关联映射的概念与要素 双向多对多关联映射,指的是两个实体类…

    Java 2023年5月19日
    00
  • java获取整点与凌晨的时间戳

    获取整点与凌晨的时间戳,可以用Java中的Calendar类来实现,这个类可以帮助我们获取日期时间的各个部分,例如年份、月份、日期、小时数、分钟数等,还可以进行日期时间的加减运算。具体实现步骤如下: 1. 获取整点的时间戳 获取当前整点的时间戳,我们可以先获取当前的年、月、日和小时,然后将分钟和秒数置为0,最后再获取时间戳即可。 Calendar calen…

    Java 2023年5月20日
    00
  • java输入字符串并将每个字符输出的方法

    当我们在Java中输入字符串时,可以使用Scanner类中的next()方法来读取字符串。然后,我们可以使用for循环遍历读取到的字符串,使用charAt()方法获取每个字符并将其输出。 以下是实现这个过程的示例代码: import java.util.Scanner; public class PrintStringCharacters { public …

    Java 2023年5月26日
    00
  • Spring中使用atomikos+druid实现经典分布式事务的方法

    Spring是一个非常流行的Java框架,可以用于构建各种类型的应用程序,包括分布式应用程序。在分布式应用程序中,经典的分布式事务是非常重要的,它可以确保整个事务的一致性和完整性。Atomikos和Druid是常用的分布式事务解决方案,它们都有很多优点,例如可靠性、高性能和灵活性等。下面是如何在Spring中使用Atomikos和Druid实现经典分布式事务…

    Java 2023年5月20日
    00
  • Java验证时间格式是否正确方法类项目实战

    Java验证时间格式是否正确方法类项目实战 介绍 在Java开发过程中,经常需要验证时间日期格式是否正确,例如用户提交的时间日期格式是否符合规范,或者我们需要对某个日期字符串进行解析等等。这篇文章将介绍如何在Java中验证时间日期格式是否正确的方法类项目实战。 步骤 步骤一:创建时间格式验证工具类 我们可以创建一个名为 DateTimeUtil 的工具类来进…

    Java 2023年5月20日
    00
  • 基于Spring中各个jar包的作用及依赖(详解)

    下面是“基于Spring中各个jar包的作用及依赖(详解)”的攻略: 1. Spring的常用jar包 Spring框架的常用jar包包括以下几个: spring-core:Spring框架的核心,提供了依赖注入(DI)和控制反转(IoC)的基本支持。 spring-beans:Spring框架的Bean工厂及其配置工具,用于创建和管理Bean对象。 spr…

    Java 2023年5月19日
    00
  • 一文带你搞懂Java定时器Timer的使用

    一文带你搞懂Java定时器Timer的使用 概述 Java定时器(Timer)是一个工具,用来在指定的时间间隔内执行任务。通常用于定期执行一些操作,比如定时刷新数据、定时备份、定时发送邮件等。 Java定时器有两种实现方式:Timer 和 ScheduledThreadPoolExecutor。Timer 是 JDK 原生提供的实现方式,而 Schedule…

    Java 2023年5月20日
    00
  • Java this关键字的引用详解

    Java this关键字的引用详解 在Java开发中,this是一个非常常用的关键字,它用于引用当前对象。在本篇攻略中,我将为大家详细讲解this的使用方法和注意事项。 什么是this关键字 在Java中,每个对象都有自己的属性和方法。当我们在方法内部使用一个属性时,有可能会和方法中的参数或局部变量同名,这时候我们需要使用this关键字来区分它们。 this…

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