如何使用JFrame完成动态模拟时钟

yizhihongxing

使用JFrame完成动态模拟时钟的攻略可以分为以下几个步骤:

1. 导入Swing包

使用JFrame需要导入Swing包,可以在文件头添加以下代码:

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.FontMetrics;
import java.awt.Dimension;
import java.awt.BasicStroke;
import java.util.Calendar;
import java.util.Date;

2. 创建时钟面板

使用JPanel创建一个时钟面板,可以设置时钟面板的背景色、大小等属性,代码如下所示:

public class ClockPanel extends JPanel {

    private int width, height;
    private Date date;

    public ClockPanel(int width, int height) {
        this.width = width;
        this.height = height;
        setPreferredSize(new Dimension(width, height));
        setBackground(Color.WHITE);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        drawClock(g);
    }

    private void drawClock(Graphics g) {
        // 画钟面
        g.setColor(Color.BLACK);
        g.drawOval(10, 10, width - 20, height - 20);
        g.fillOval(10, 10, width - 20, height - 20);
        // 画刻度
        for (int i = 0; i < 12; i++) {
            double angle = Math.PI / 6 * i;
            int x1 = (int)(width / 2 + (width / 2 - 40) * Math.cos(angle));
            int y1 = (int)(height / 2 + (height / 2 - 40) * Math.sin(angle));
            int x2 = (int)(width / 2 + (width / 2 - 20) * Math.cos(angle));
            int y2 = (int)(height / 2 + (height / 2 - 20) * Math.sin(angle));
            g.drawLine(x1, y1, x2, y2);
        }
        // 画数字
        FontMetrics fm = g.getFontMetrics();
        int fontHeight = fm.getHeight();
        for (int i = 1; i <= 12; i++) {
            double angle = Math.PI / 6 * i;
            String numberStr = String.valueOf(i);
            int x = (int)(width / 2 + (width / 2 - 60) * Math.cos(angle)) - fm.stringWidth(numberStr) / 2;
            int y = (int)(height / 2 + (height / 2 - 60) * Math.sin(angle)) + fontHeight / 3;
            g.drawString(numberStr, x, y);
        }
        // 画指针
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        int hour = calendar.get(Calendar.HOUR);
        int minute = calendar.get(Calendar.MINUTE);
        int second = calendar.get(Calendar.SECOND);
        int millis = calendar.get(Calendar.MILLISECOND);
        int hourAngle = (hour % 12) * 30 + minute / 2;
        int minuteAngle = minute * 6;
        int secondAngle = second * 6 + millis / 600;
        g.setColor(Color.RED);
        g.setStroke(new BasicStroke(3));
        drawPointer(g, hourAngle, 60, 5);
        drawPointer(g, minuteAngle, 80, 3);
        drawPointer(g, secondAngle, 100, 1);
    }

    private void drawPointer(Graphics g, int angle, int length, int width) {
        double radians = Math.toRadians(angle - 90);
        int x = (int)(width / 2 * Math.cos(radians));
        int y = (int)(width / 2 * Math.sin(radians));
        g.drawLine(width / 2, height / 2, width / 2 + x, height / 2 + y);
        radians = Math.toRadians(angle + 90);
        x = (int)(length * Math.cos(radians));
        y = (int)(length * Math.sin(radians));
        g.drawLine(width / 2 + x, height / 2 + y, width / 2 + x + width * x / Math.abs(x + y), height / 2 + y - width * y / Math.abs(x + y));
        g.drawLine(width / 2 + x, height / 2 + y, width / 2 + x - width * x / Math.abs(x + y), height / 2 + y + width * y / Math.abs(x + y));
    }

    public void setDate(Date date) {
        this.date = date;
        repaint();
    }
}

3. 创建时钟窗口

使用JFrame创建一个时钟窗口,并将时钟面板添加到窗口中,可以设置窗口的标题、大小等属性,代码如下所示:

public class ClockWindow extends JFrame {

    public ClockWindow() {
        setTitle("Clock");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        ClockPanel clockPanel = new ClockPanel(300, 300);
        add(clockPanel);
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
        Timer timer = new Timer(10, e -> {
            clockPanel.setDate(new Date());
        });
        timer.start();
    }

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

这段代码创建了一个时钟窗口,窗口的标题为“Clock”,并将ClockPanel添加到窗口中。使用Timer定时更新时钟的显示。在每次更新时钟的时候,调用ClockPanel的setDate方法将当前时间传入,并调用repaint方法重新绘制时钟。

这是一个使用JFrame完成动态模拟时钟的例子,可以参考并修改代码,实现不同样式的时钟效果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:如何使用JFrame完成动态模拟时钟 - Python技术站

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

相关文章

  • Java数组扩容实例代码

    下面我来为你详细讲解Java数组扩容实例代码的完整攻略。 1. 初探数组扩容 在Java中,数组是一种非常常用的数据结构,但是数组的长度是固定的,无法动态增长,这会限制数组的使用。为了解决这个问题,我们可以使用Java的数组扩容机制,实现数组的动态增长。 1.1 数组扩容原理 当数组不够用时,我们需要创建一个新的更大的数组来替换原来的数组。具体步骤为: 创建…

    Java 2023年5月23日
    00
  • 详解Springboot之接收json字符串的两种方式

    下面是详解“详解Springboot之接收json字符串的两种方式”的完整攻略。 1. 介绍 Spring Boot是一个快速开发框架,它可以简化Spring的配置和开发过程。在使用Spring Boot的过程中,经常需要接收json字符串数据,本篇文章将详细介绍Spring Boot中接收json字符串的两种方式。 2. 方式一:使用@RequestBod…

    Java 2023年5月20日
    00
  • 一文带你学会Java网络编程

    一文带你学会Java网络编程攻略 什么是网络编程 网络编程指的是利用计算机网络实现不同计算机间的数据通信。网络编程需要使用网络协议和Socket套接字等技术。Java语言提供了丰富的网络编程API,开发者们可以利用Java语言实现各种网络通信。 Java网络编程的核心技术 协议 网络编程中最关键的技术就是各种网络协议:TCP、UDP、HTTP、SMTP、FT…

    Java 2023年5月19日
    00
  • 从搭建Struts2 开发环境说起

    下面我将详细介绍“从搭建Struts2 开发环境说起”的完整攻略。 1. 安装Java环境 在使用 Struts2 开发前,首先需要安装 Java 开发环境。可以到官网下载并安装 JDK,这里我以 JDK 1.8 为例。 下载JDK 1.8安装包,并安装到你的电脑上。 配置JAVA_HOME环境变量,将JDK安装路径添加到PATH环境变量中,以便在命令行中可…

    Java 2023年5月20日
    00
  • Java 超详细讲解字符流

    Java 超详细讲解字符流 什么是字符流 在Java中,字节流常常用来处理二进制数据(如图片、音频等),而字符流则使用在处理文本数据(如txt文件等)。不同于字节流,字符流是基于16位Unicode编码的字符来处理数据的。 Java中提供了两类字符流:Reader和Writer。Reader用于读取字符流,Writer用于写入字符流。 字符流的工作方式 字符…

    Java 2023年5月20日
    00
  • SpringBoot2零基础到精通之映射与常用注解请求处理

    SpringBoot2零基础到精通之映射与常用注解请求处理 Spring Boot是一个非常流行的Java框架,它可以帮助开发人员快速构建基于Spring的应用程序。在本文中,我们将详细讲解如何使用Spring Boot进行请求处理,并介绍常用的注解和映射方式。 常用注解 @Controller @Controller注解用于标记一个类为控制器,用于处理HT…

    Java 2023年5月15日
    00
  • 常见JavaWeb安全问题和解决方案

    常见JavaWeb安全问题和解决方案 引言 JavaWeb应用的普及使其突显出越来越多的安全威胁。在开发JavaWeb应用时,我们需要考虑如何确保安全才能更好地保护用户个人信息和应用程序数据。本攻略为您提供了一些常见的JavaWeb安全问题和解决方案,希望对您有所帮助。 常见JavaWeb安全问题 SQL注入 SQL注入是一种常见的安全威胁,攻击者可以利用这…

    Java 2023年5月27日
    00
  • java Freemarker页面静态化实例详解

    Java FreeMarker页面静态化实例详解 什么是FreeMarker页面静态化 FreeMarker是一款基于模板技术实现的Java模板引擎,它可以将动态的HTML页面转化成静态的HTML页面,将一个基于模板的数据模型填充到模板中生成完整的HTML页面,并将HTML页面中的占位符等内容替换成相应的数据,将页面的内容动态的生成并输出。FreeMarke…

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