使用Swing绘制动态时钟

论坛 期权论坛 脚本     
niminba   2021-5-23 03:49   1757   0

本文实例为大家分享了利用Swing绘制一个动态时钟的具体代码,供大家参考,具体内容如下

效果

代码在下面,可跳过解析。

前言

编程实现一个时钟

利用Swing绘制一个时钟,只能是静态的。利用Calendar类获取当前的时分秒,然后根据数学公式绘制相应的时钟就可以了。

如果静态的时钟已经足够你使用,那么就无须用到线程的概念。

如何让时钟“动起来”

当然了,动起来肯定是不可能的,但是我们可以利用人眼的视觉,让时钟“好像动起来”,其实着很简单,只要让当前的图像每隔一秒种刷新一次就可以了。这样秒针在动,数字时间也在动,整个时钟就好像“动起来了”

线程

利用线程实现刷新,刷新间隔是1秒,每次刷新都先生成当前的时间,然后JVM又会自动调用paintComponent方法绘制图形,这样就好像时钟动起来了。

Thread thread = new Thread(){
      public void run(){
        while(true){
          StillClock clock = new StillClock();
          MessagePanel messagePanel1=new MessagePanel(clock.getHour()+":"+
              clock.getMinute()+":"+clock.getSecond());
          //设置显示居中
          messagePanel1.setCentered(true);
          //设置前景颜色
          messagePanel1.setForeground(Color.black);
          //设置字体
          messagePanel1.setFont(new Font("Courier",Font.BOLD,16));

          add(clock);
          add(messagePanel1,BorderLayout.SOUTH);
          clock.setVisible(true);
          validate();    //接下来会每隔一秒重绘一次时钟——即(从frame中将clock组件删除),因此调用validate方法,使容器重新布置其子组件
          try {
            Thread.sleep(1000);
          } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
          clock.setVisible(false);
          remove(clock);   //在父容器中将其删除
          clock.invalidate();    //使容器失效
        }
      }
    };
    thread.start();

线程代码解析

Thread thread = new Thread(){};

注意结尾使用了分号,既然使用了线程,那么需要重写它的run方法:

public void run(){}

既然想让时钟一直动起来,那么死循环是最好的选择

while(true){}

在while里面,每次都先生成当前的时间:

StillClock clock = new StillClock();

这里生成了一个无参构造的StillClock类,StillClock的无参构造方法里面会自动生成当前的时间。

注意:这里的StillClock是我自己定义的,代码贴在后面,但是如果不关心他是怎么实现的,可以直接忽略原理,直接使用,包括代码里面的messagePanel也是一样的自定义类。

时间生成完了之后,把时钟图形、当前时间的字符串、布局位置利用add()方法绘制到屏幕上

add(clock);
add(messagePanel1,BorderLayout.SOUTH);

接下来会每隔一秒重绘一次时钟——即(从frame中将clock组件删除),因此调用validate方法,使容器重新布置其子组件。

thread.start();

让线程开始工作把。

完整代码

DisplayClock.java:

package Test;

import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;

public class DisplayClock extends JFrame {
  public DisplayClock(){
    //创建一个现在的时间
    StillClock clock=new StillClock();
    //获取当前的时间
    clock.setCurrentTime();
    //设置时间的显示格式

    Thread thread = new Thread(){
      public void run(){
        while(true){
          StillClock clock = new StillClock();
          MessagePanel messagePanel1=new MessagePanel(clock.getHour()+":"+
              clock.getMinute()+":"+clock.getSecond());
          //设置显示居中
          messagePanel1.setCentered(true);
          //设置前景颜色
          messagePanel1.setForeground(Color.black);
          //设置字体
          messagePanel1.setFont(new Font("Courier",Font.BOLD,16));

          add(clock);
          add(messagePanel1,BorderLayout.SOUTH);
          clock.setVisible(true);
          validate();    //接下来会每隔一秒重绘一次时钟——即(从frame中将clock组件删除),因此调用validate方法,使容器重新布置其子组件
          try {
            Thread.pmoveDown(){
    yCoordinate-=interval;
    repaint();
  }
  //固定写法,不必探究
  @Override
  public Dimension getPreferredSize() {
    return new Dimension(200,30);
  }
}

结束

写的有些粗糙,有需要的可以根据自己的需求进行更改,比如如何更加稳定的实现动态时钟,让时钟刻度更加精细(根据数学公式增加刻度线即可),希望可以帮助到你。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持社区。

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1060120
帖子:212021
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP