欢迎来到
银狐的个人博客

Java画简易时钟遇到的问题(附源码)

我是一个刚入门的小菜鸟,希望我写的东西可以帮助和我一样刚入门的兄弟们少走一些弯路,也希望大佬们可以多指点指点我。感谢!

 

解决在画时钟遇到的问题让我花费不少时间 ~~~~~~  说两个困扰我比较久的

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

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

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

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

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

加入下列代码就行啦 

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

为什么会有这个问题呢?

因为你之前画上去的没有擦掉&#xff0Java画简易时钟遇到的问题(附源码) 第1张图片-银狐博客c;所以全混在一起

然后咋解决呢?

想到用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.paintCJava画简易时钟遇到的问题(附源码) 第2张图片-银狐博客omponent(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)));    }}


 

赞(0) 打赏
版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《Java画简易时钟遇到的问题(附源码)》
文章链接:https://www.yinhu3.com/2446.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。
如果文章侵犯到你的权益,请查看本站免责声明:《免责声明》

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

愿意请我喝杯矿泉水吗

支付宝扫一扫打赏