java实现时钟表盘

 更新时间:2022年09月11日 08:33:59   作者:Jiafu_Liu  
这篇文章主要为大家详细介绍了java实现时钟表盘,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了java实现时钟表盘的具体代码,供大家参考,具体内容如下

设计并实现一个模拟时钟功能的应用程序。程序中应显示时针、分针和秒针,并同时以数字形式显示当前时间。

实现结果:

源代码如下:

//ClockPanel.java
import javax.swing.*;
import java.util.Calendar;  
import java.util.GregorianCalendar;  
import java.util.Timer;  
import java.util.TimerTask;  
import java.text.SimpleDateFormat;
import java.util.Locale;  
import java.awt.*;
import java.awt.event.*;

public class ClockPanel extends JPanel{
    private GregorianCalendar calendar;
    private JButton btn;
    private JButton btn2;
    private int currentState=8; 
    private String zone;
    private int hourTemp;
    final int X=320, Y=240, R=120;   // 圆心坐标,半径
    private int xPos,yPos;
    private int hour,minute,second; 
    private int xHour,yHour,xMinute,yMinute,xSecond,ySecond;//表针位置(大端)
    private int xHour1,yHour1,xMinute1,yMinute1,xSecond1,ySecond1;//表针位置(小端)
    private double a_sec,a_min ,a_hour;//角度

    ClockPanel() {   // 创建定时器对象
        Timer t = new Timer();  
        Task task = new Task();  
        t.schedule(task, 0, 1000); 
        setLayout(new BorderLayout(10,20)); 
        btn=new JButton("时区  上");
        btn2=new JButton("时区 下");
        btn.setBorder(BorderFactory.createRaisedBevelBorder());
        btn2.setBorder(BorderFactory.createRaisedBevelBorder());
        btn.setBackground(Color.green);
        btn2.setBackground(Color.green);
        btn.addActionListener(new ButtonListener()); 
        btn2.addActionListener(new ButtonListener()); 
        add(btn,BorderLayout.WEST); 
        add(btn2,BorderLayout.EAST); 
    }
    //相关事件处理
    private class ButtonListener implements ActionListener {
        public void actionPerformed(ActionEvent event) {    

            if (event.getSource()==btn)
                currentState++;
            if (event.getSource()==btn2)
                currentState--;
        }

    }

    public void paintComponent(Graphics g){ 
        super.paintComponent(g); 
        double alfa;    //所画点对应的角度
        Graphics2D g2d=(Graphics2D)g;
        BasicStroke bstroke=new BasicStroke(1.0f);
        BasicStroke bstroke2=new BasicStroke(2.0f);
        BasicStroke bstroke3=new BasicStroke(3.0f);

        g2d.setStroke(bstroke2);
        for(int i=0;i<=360;i+=6)  {
            alfa=Math.toRadians(i);  //角度用弧度表示
            xPos=X+(int)(R*Math.cos(alfa));   // x坐标
            yPos=Y-(int)(R*Math.sin(alfa));   // y坐标
            int xBegin=320+(int)(144*Math.sin(alfa));
            int yBegin=240-(int)(144*Math.cos(alfa));
            int xEnd=320+(int)(159*Math.sin(alfa));
            int yEnd=240-(int)(159*Math.cos(alfa));

            g2d.setColor(Color.BLACK);
            g2d.drawLine(xBegin,yBegin,xEnd,yEnd);

            g2d.setColor(Color.RED);
            switch(i){  // 写时钟数字刻度
                case 0: g2d.drawString("3", xPos,yPos);
                        break;
                case 90: g2d.drawString("12", xPos,yPos);
                        break;
                case 180: g2d.drawString("9", xPos,yPos);
                        break;
                case 270: g2d.drawString("6",xPos,yPos);
                        break;      
            }

            if(i%30==0){
                g2d.drawLine(xBegin,yBegin,xEnd,yEnd);
            }

        }


        g2d.setColor(Color.BLACK);
        g2d.setStroke(bstroke3);
        g2d.drawLine(X, Y, xHour,yHour);    // 画时针
        g2d.drawLine(X, Y, xHour1,yHour1);  
        g2d.setColor(Color.BLUE);
        g2d.setStroke(bstroke2);
        g2d.drawLine(X, Y, xMinute,yMinute);    // 画分针
        g2d.drawLine(X, Y, xMinute1,yMinute1);
        g2d.setColor(Color.RED);
        g2d.setStroke(bstroke);
        g2d.drawLine(X, Y, xSecond,ySecond);    // 画秒针
        g2d.drawLine(X, Y, xSecond1,ySecond1);
        //表盘中心点1
        g2d.drawOval(317,237,6,6); 
        g2d.fillOval(317,237,6,6);
        //表盘中心点2
        g2d.setColor(Color.BLACK);
        g2d.drawOval(319,238,4,4); 
        g2d.fillOval(319,238,4,4);
        //表盘中心圆环
        g2d.setColor(Color.ORANGE);
        g2d.drawOval(300,220,40,40); 
        g2d.setColor(Color.black);
        g2d.drawString("15010140079",290,376); 

        GregorianCalendar gre=new GregorianCalendar(); 
        SimpleDateFormat dateforamt1=new SimpleDateFormat("yyyy年MM月dd日E");
        //SimpleDateFormat dateforamt2=new SimpleDateFormat("H时m分s秒");
        g2d.setColor(Color.black);
        g2d.setFont(new Font("SAN_SERIF",Font.BOLD,20)); 
        g2d.drawString(dateforamt1.format(gre.getTime()),250,50);

        g2d.drawString(hour+"时"+minute+"分"+second+"秒",260,430);
        //时区判断
        if(currentState>12){
            currentState=-11;
        }
        else if(currentState<-11){
            currentState=12;
        }
        if(currentState<=12&&currentState>=1)
            zone="东"+currentState+"区";
        else
            zone="西"+(1-currentState)+"区";
        g2d.drawString(zone,170,50); 

    }

    class Task extends TimerTask {  
        public void run() {  
            calendar = new GregorianCalendar();  
            hourTemp=currentState>0?(currentState-8):(currentState-1);
            hour = calendar.get(Calendar.HOUR)+hourTemp;  
            minute = calendar.get(Calendar.MINUTE);  
            second = calendar.get(Calendar.SECOND); 

            a_sec = second * 2 * Math.PI / 60;
            a_min = minute * 2 * Math.PI / 60 + a_sec / 60;
            a_hour = hour * 2 * Math.PI / 12 + a_min / 12;
            // 计算时、分、秒针的末端位置
            xSecond=320+(int)(110*Math.sin(a_sec));
            ySecond=240-(int)(110*Math.cos(a_sec));
            xMinute=320+(int)(90 *Math.sin(a_min));
            yMinute=240-(int)(90 *Math.cos(a_min));
            xHour=  320+(int)(70 *Math.sin(a_hour));
            yHour=  240-(int)(70 *Math.cos(a_hour));
            xSecond1=320-(int)(22*Math.sin(a_sec));
            ySecond1=240+(int)(22*Math.cos(a_sec));
            xMinute1=320-(int)(15*Math.sin(a_min));
            yMinute1=240+(int)(15*Math.cos(a_min));
            xHour1  =320-(int)(5 *Math.sin(a_hour));
            yHour1  =240+(int)(5 *Math.cos(a_hour));

            repaint();  
        }  
    }  
}


//
//Clock.java
import javax.swing.*;

public class Clock{ 
    public static void main(String[] args) {
         JFrame frame=new JFrame("Clock");    //创建图文框
         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         frame.getContentPane().add(new ClockPanel()); //添加面板
         frame.setVisible(true);
         frame.setSize(640,480);         
    }
}

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

相关文章

  • SpringBoot中6种API版本控制策略小结

    SpringBoot中6种API版本控制策略小结

    API版本控制是确保系统平稳演进的关键策略,这篇文章主要为大家详细介绍了SpringBoot中6种API版本控制策略,大家可以根据需要自行选择
    2025-04-04
  • java 文件目录读写删除操作详细实现代码

    java 文件目录读写删除操作详细实现代码

    这篇文章主要介绍了java 文件读写删操作详细实现代码,需要的朋友可以参考下
    2017-09-09
  • Java中BigDecimal类与int、Integer使用总结

    Java中BigDecimal类与int、Integer使用总结

    这篇文章主要给大家介绍了关于Java中BigDecimal类与int、Integer使用的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-07-07
  • mybatis模糊查询like语句该如何写

    mybatis模糊查询like语句该如何写

    MyBatis模糊查询通常使用LIKE关键字,结合concat函数拼接通配符%实现,在MyBatis配置文件中,通过#{keyword}传递参数,生成带有通配符的查询语句,MyBatis-Plus中,通过LambdaQueryWrapper类和like方法构建模糊查询条件,简化查询操作
    2024-09-09
  • SpringBoot浅析安全管理之OAuth2框架

    SpringBoot浅析安全管理之OAuth2框架

    安全管理是软件系统必不可少的的功能。根据经典的“墨菲定律”——凡是可能,总会发生。如果系统存在安全隐患,最终必然会出现问题,这篇文章主要介绍了SpringBoot安全管理OAuth2框架的使用
    2022-08-08
  • spring boot--从controller到DAO操作

    spring boot--从controller到DAO操作

    这篇文章主要介绍了spring boot--从controller到DAO操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • SpringBoot如何在线程中获取@Service Bean类

    SpringBoot如何在线程中获取@Service Bean类

    这篇文章主要介绍了SpringBoot如何在线程中获取@Service Bean类,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Java访问者模式实现优雅的对象结构处理

    Java访问者模式实现优雅的对象结构处理

    Java访问者模式是一种行为型设计模式,它通过将数据结构和数据操作分离,实现对复杂对象结构的处理。它将数据结构中的每个元素都转换为访问者能够识别的形式,从而使得数据操作可以在不影响数据结构的前提下进行扩展和变化
    2023-04-04
  • 详解Java中的迭代迭代器Iterator与枚举器Enumeration

    详解Java中的迭代迭代器Iterator与枚举器Enumeration

    Iterator与Enumeration分别是实现迭代器和枚举器类的接口,下面就带大家来详解Java中的迭代迭代器Iterator与枚举器Enumeration,以及它们之间的区别.
    2016-05-05
  • nacos客户端一致性hash负载需求实现

    nacos客户端一致性hash负载需求实现

    这篇文章主要介绍了nacos客户端一致性hash负载的需求实现过程及步骤详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-02-02

最新评论