Java 画时钟遇到的问题及解决方案

 更新时间:2021年11月05日 10:54:57   作者:烟溪彭于晏  
我是一个刚入门的小菜鸟,希望我写的东西可以帮助和我一样刚入门的兄弟们少走一些弯路,也希望大佬们可以多指点指点我。感谢!解决在画时钟遇到的问题让我花费不少时间...说两个困扰我比较久的

1.不能一直得到当前的时间,导致刷新时间不变。

刚开始我自以为把int s = calendar.get(Calendar.SECOND)放到一个线程线程里再刷新就可以看到秒的变化了,

可惜结果并不是我想到那样,画面并没有任何变化。

然后我一顿乱操作,最后还是得去问老师。/(ㄒoㄒ)/~~ /(ㄒoㄒ)/~~

让我知道了还有时间监听器这个东西,看来我知道还是太少啦 (;′⌒`)

加入下列代码就行啦

2.piant方法里

g.drawString("s",x,y)刷新的时候后一个数字覆盖前一个数字,假如秒从0开始,下一秒的1会直接画在0上,原来的0不会消失,drawLine()也是如此。如下图

为什么会有这个问题呢?

因为你之前画上去的没有擦掉,所以全混在一起

然后咋解决呢?

想到用g.clearRect()去解决,发现位置有点难调。/(ㄒoㄒ)/~~

调了半天然后发现直接覆盖了连内容都不显示了 /(ㄒoㄒ)/~~ 不知道是不是我的用法有错 ≧ ﹏ ≦

到这里我只能去找度娘求助。

找到了一个好办法 上图:

也就是图上两行代码。

调用super.paintComponent(g) 问题就被解决了

super.paintComponent(g) 会调用组件的原始界面重新绘制,这样就相当于把上次的擦除啦。

最后把我源码附上。请各位指点!

 
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.http.WebSocket;
import java.net.http.WebSocket.Listener;
import java.util.Calendar;
import java.util.Date;
 
public class ClockFrame extends JFrame {
    ClockFrame() {
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400, 400);
        setLocationRelativeTo(null);
    }
 
    public static void main(String[] args) {
        ClockFrame frame = new ClockFrame();
        ClockPanel panel = new ClockPanel();
        frame.add(panel);
        panel.setCalendar();
        frame.setVisible(true);
    }
}
 
 
class ClockPanel extends JPanel {
    //        画h:m:s;
    Calendar calendar = Calendar.getInstance();
    int s = calendar.get(Calendar.SECOND);
    int m = calendar.get(Calendar.MINUTE);
    int h = calendar.get(Calendar.HOUR);
 
    public void setCalendar() {
        Timer timer = new Timer(1000, new Listener());
        timer.start();
    }
    class Listener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            s++;
            if (s == 60) {
                m++;
                s = 0;
            }
            if (m == 60) {
                h++;
                m = 0;
            }
            repaint();
        }
    }
 
    //run 动态
    int sx = 190;
    int sy = 70;
 
    ClockPanel() {
        setBackground(Color.GRAY);
    }
 
    public void paint(Graphics g) {
        super.paintComponent(g);
//        圆
        g.drawOval(83, 57, 220, 220);
 
        //画点
        g.fillOval(190, 170, 5, 5);//Center
        for (int i = 12; i > 0; i--) {
            g.fillOval((int) (190 + 100 * Math.sin(Math.PI / 6 * i)), (int) (170 + 100 * Math.cos(Math.PI / 6 * i)), 5, 5);
            String time = i + "";
            g.setFont(new Font("微软雅黑", Font.BOLD, 15));
            g.drawString(time, (int) (190 + Math.sin(Math.PI / 6 * i) * 100), (int) (170 - Math.cos(Math.PI / 6 * i) * 100));
        }
        g.setFont(new Font("微软雅黑", Font.BOLD, 20));
        String S = s > 10 ? s + "" : "0" + s;
        String M = m > 10 ? m + "" : "0" + m;
        String H = h > 10 ? h + "" : "0" + h;
        g.drawString("现在是中国时间" + H + ":" + M + ":" + S, 80, 40);
 
        final BasicStroke stokeLine = new BasicStroke(3.0f);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setStroke(stokeLine);
        g.setColor(Color.black);
        g.drawLine(190, 170, (int) (190 + (Math.cos((s * Math.PI / 30) - Math.PI / 2) * 100)), (int) (170 + (Math.sin((s * Math.PI / 30 - Math.PI / 2)) * 100)));
        g.setColor(Color.blue);
        g.drawLine(190, 170, (int) (190 + (Math.cos((m * Math.PI / 30 - Math.PI / 2)) * 100)), (int) (170 + (Math.sin((m * Math.PI / 30 - Math.PI / 2)) * 100)));
        g.setColor(Color.GREEN);
        g.drawLine(190, 170, (int) (190 + (Math.cos((h * Math.PI / 12)) * 100)), (int) (170 + ((Math.sin(h * Math.PI / 12)) * 100)));
    }
}
 
 
 

到此这篇关于Java 画时钟遇到的问题及解决方案的文章就介绍到这了,更多相关Java 画时钟内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java实现本地日期时间处理

    java实现本地日期时间处理

    这篇文章主要介绍了本地日期时间处理的程序,实现了下面的功能,大家参考使用吧
    2014-01-01
  • 详解使用Spring Boot开发Web项目

    详解使用Spring Boot开发Web项目

    这篇文章主要介绍了详解使用Spring Boot开发Web项目,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-04-04
  • IDEA中实体类(POJO)与JSON快速互转问题

    IDEA中实体类(POJO)与JSON快速互转问题

    这篇文章主要介绍了IDEA中实体类(POJO)与JSON快速互转,本文通过图文实例代码相结合给大家介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • Java实现TFIDF算法代码分享

    Java实现TFIDF算法代码分享

    这篇文章主要介绍了Java实现TFIDF算法代码分享,对算法进行了简单介绍,概念,原理,以及实现代码的分享,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Java TimedCache 带时间缓存工具类详解使用

    Java TimedCache 带时间缓存工具类详解使用

    工具类是包含集合框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组、日期Date类、堆栈Stack类、向量Vector类等)。集合类、时间处理模式、日期工具等各类常用工具包,本文将介绍带时间缓存工具类
    2021-10-10
  • Java中枚举的实现原理介绍

    Java中枚举的实现原理介绍

    大家好,本篇文章主要讲的是Java中枚举的实现原理介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • Java split()方法中的特殊符号举例详解

    Java split()方法中的特殊符号举例详解

    Java中的split方法可以将一个字符串按照指定的分隔符进行分割,返回一个字符串数组,这篇文章主要给大家介绍了关于Java split()方法中的特殊符号的相关资料,需要的朋友可以参考下
    2023-07-07
  • 在SpringBoot项目中实现读写分离的流程步骤

    在SpringBoot项目中实现读写分离的流程步骤

    SpringBoot作为一种快速开发框架,广泛应用于Java项目中,在一些大型应用中,数据库的读写分离是提升性能和扩展性的一种重要手段,本文将介绍如何在SpringBoot项目中优雅地实现读写分离,并通过适当的代码插入,详细展开实现步骤,同时进行拓展和分析
    2023-11-11
  • Java实现经典游戏飞机大战-I的示例代码

    Java实现经典游戏飞机大战-I的示例代码

    《飞机大战-I》是一款融合了街机、竞技等多种元素的经典射击手游。本文将利用java语言实现这游戏,文中采用了swing技术进行了界面化处理,感兴趣的可以了解一下
    2022-02-02
  • 详解Java的构造方法及类的初始化

    详解Java的构造方法及类的初始化

    这篇文章主要为大家详细介绍了Java的构造方法及类的初始化,文中的示例代码讲解详细,对我们学习Java有一定的帮助,感兴趣的小伙伴可以了解一下
    2022-08-08

最新评论