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

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 画时钟内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • javafx实现时钟效果

    本文实例为大家分享了javafx实现时钟效果的具体代码,供大家参考,具体内容如下 核心为三个函数: 第一个为 public void dials,绘制表盘 第二个为 public void scale,绘制刻度,这里需要注意的是字体旋转 第三个为 public void point,绘制秒分时针以及打印时间,需要注意的是进制问题 总的源码如下: package com.wu.demo; import java.time.LocalDateTime; import java.time.format

  • java实现时钟效果

    本文实例为大家分享了java实现时钟效果的具体代码,供大家参考,具体内容如下 实现效果如图: Java代码: 文件一:ClockPanel.java import static java.util.Calendar.HOUR; import static java.util.Calendar.MILLISECOND; import static java.util.Calendar.MINUTE; import static java.util.Calendar.SECOND; import j

  • Java实现动态模拟时钟

    本文实例为大家分享了java动态模拟时钟的具体代码,供大家参考,具体内容如下 应用名称:java动态模拟时钟 用到的知识:javaGUI,java 绘图 开发环境:win10+eclipse+jdk1.8 功能说明:通过java绘图画出一个虚拟的动态时钟 效果图: 源代码: import javax.swing.*; import java.awt.*; import java.util.*; import java.lang.Thread; import java.text.DecimalFo

  • JavaFX实现简易时钟效果(二)

    本文实例为大家分享了JavaFX实现简易时钟效果的具体代码,供大家参考,具体内容如下 在前一篇博客中,我们已经绘制了一个静止时钟. 绘制简易时钟(一) 首先进行一个微调:让表盘根据窗口大小自动调整大小: 在 ShowClock.start() 中,添加对面板长宽的监听. pane.widthProperty().addListener(ov -> clock.setW(pane.getWidth())); pane.heightProperty().addListener(ov -> cloc

  • JavaFX实现简易时钟效果

    本文实例为大家分享了JavaFX实现简易时钟效果的具体代码,供大家参考,具体内容如下 首先要在面板中显示一个时钟,我们可以设计一个ClockPane类来显示一个时钟. 最终效果: 若要绘制一个时钟,需要绘制一个圆并为秒钟.分钟和小时绘制三个指针.为了画一个指针,需要确定一条直线的两端:一端是时钟的中央,位于(centerX,centerY):另外一端位于(endX,endY),由一下公式来确定: endX=centerX+handLength×sin(θ) endY=centerY-handLe

  • Java实现动态数字时钟

    本文实例为大家分享了Java实现动态数字时钟的具体代码,供大家参考,具体内容如下 构建: Clock继承 JFrame 为运行页面 ClockText 测试类 创建 Clock 对象 运行效果: 具体实现: 一.Clock类 四个JPnal 三个放时间 最后一个放日期 放时间的三个JPnal 分别加入 地点 时间 按钮 最后一个按钮添加日期 具体实现如下: public class Clock extends JFrame { private JPanel jPanelBeijing; priv

  • Java实现的动态数字时钟功能示例【显示世界时间】

    本文实例讲述了Java实现的动态数字时钟功能.分享给大家供大家参考,具体如下: 构建: 1. Clock继承 JFrame 为运行页面 2. ClockText 测试类 创建 Clock 对象 运行效果: 具体实现: 一.Clock类  四个JPnal 三个放时间 最后一个放日期 放时间的三个JPnal 分别加入 地点 时间 按钮 最后一个按钮添加日期 具体实现如下: public class Clock extends JFrame { private JPanel jPanelBeijing

  • JavaFX实现简易时钟效果(一)

    本文实例为大家分享了JavaFX实现简易时钟效果的具体代码,供大家参考,具体内容如下 效果图 用当前时间创建时钟,绘制表盘. 钟表是静止的.让指针动起来,请参照:绘制简易时钟(二) 主函数文件 ShowClock: package primier; import javafx.application.Application; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Scene;

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

    1.不能一直得到当前的时间,导致刷新时间不变. 刚开始我自以为把int s = calendar.get(Calendar.SECOND)放到一个线程线程里再刷新就可以看到秒的变化了, 可惜结果并不是我想到那样,画面并没有任何变化. 然后我一顿乱操作,最后还是得去问老师./(ㄒoㄒ)/~~ /(ㄒoㄒ)/~~ 让我知道了还有时间监听器这个东西,看来我知道还是太少啦 (:′⌒`) 加入下列代码就行啦 2.piant方法里 g.drawString("s",x,y)刷新的时候后一个数字覆盖

  • java实现时钟表盘

    本文实例为大家分享了java实现时钟表盘的具体代码,供大家参考,具体内容如下 设计并实现一个模拟时钟功能的应用程序.程序中应显示时针.分针和秒针,并同时以数字形式显示当前时间. 实现结果: 源代码如下: //ClockPanel.java import javax.swing.*; import java.util.Calendar;   import java.util.GregorianCalendar;   import java.util.Timer;   import java.uti

  • java 中http请求为了防止乱码解决方案

    java 中http请求为了防止乱码解决方案 今天做一个与地图有关的项目,需要发起http请求地图数据 写了一个工具类,希望大家都能用上吧 package com.lrdd.utils; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter;

  • Java @Async注解导致spring启动失败解决方案详解

    前言 在这篇文章里,最后总结处,我说了会讲讲循环依赖中,其中一个类添加@Async有可能会导致注入失败而抛异常的情况,今天就分析一下. 一.异常表现,抛出内容 1.1循环依赖的两个class 1.CycleService1 @Service public class CycleService1 { @Autowired private CycleService2 cycleService2; @WangAnno @Async public void doThings() { System.out

  • java 中的乱码问题汇总及解决方案

    java中的乱码问题        最近做项目经常会遇到Java中的乱码问题,于是就抽时间整理下出现乱码问题的情况和如何处理,这里做了一个整理, 分析 编码与解码 编码就是将字符转为字节,解码就是就是将字节转换为字符. 字节流与字符流 对文件的读写操作都是通过字节流来实现的,即使JAVA中有字符流,但是其底层仍然使用的字节流. 乱码问题出现 java中使用最频繁的是字符,当我们将文件读入内存并在控制台显示时(字节流--->字符流),就需要用到解码.如果文件是UTF-8编码,而我们解码时错用成GB

  • Java Cmd运行Jar出现乱码的解决方案

    目录 Java Cmd运行Jar出现乱码 一.设定cmd的编码为utf-8 二.规定执行java时的编码方式 三.将以上命令打包成bat 3.1 在Jar的目录下创建一个txt文件 3.2 将以上命令写入txt文件中,保存 3.3 修改msgSystemStart.txt为msgSystemStart.bat 3.4 运行bat文件 cmd运行java文件 一.进到java文件所在目录 二.编译java文件 三.导入txt文件测试 Java Cmd运行Jar出现乱码 今天做项目的时候遇到一个很头

  • Java while(scanner.hasNext())无法跳出的解决方案

    目录 Java while(scanner.hasNext())无法跳出 情况说明: 原因: 解决方案: java 的while+hasNext() Java while(scanner.hasNext())无法跳出 情况说明: 该问题是在做PAT乙级1010时遇到的,我需要在键盘读入有限个数,然后两两进行计算.我一开始想的是声明一个数组,将所有读入的数字进行保存,再分别计算,但是我发现他并不会跳出我设的循环,而是一直在执行 当读入最后一个数据的时候,并不是跳出,而是阻塞在了while中,一直执

  • JAVA正则表达式匹配多个空格的解决方案

    目录 需求 解决方案 扩充知识 ()和[]有本质的区别 java中,正则表达式匹配一个或多个空格 && 正则表达式匹配两个或多个空格 正则表达式匹配多个空格 需求 针对tab键带来的多个空格问题,有时候我们针对带空格的一行数据要进行切割,如果有多个空格就会出现就会切割空格出现,我们想把空格都去掉,所以需要用到某些方法. 解决方案 利用正则表达式来匹配空格 \\s+ 首先利用split("\\s+");方法来对字符串切割,尽可能的匹配空格,这里也挺有意思,因为空格数目不一

  • Java获取文件的路径及常见问题解决方案

    在java中读取读取文件,经常因为路径的问题找不到,此文用于记录如何定位文件的简单方法. 本基于springboot做的测试,主要是构建工程方便,所用的方法都是JDK中的方法,主要测试有"/"和没有""的问题,以及getResourceAsStream(String string)和getResource(String string)的问题. 1.项目结构 解释一下,主要有两个配置文件,a.properties和b.properties,a.properties方法

随机推荐