首頁 > 軟體

java實現時鐘錶盤

2022-09-12 18:02:10

本文範例為大家分享了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);         
    }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com