java实验一:写一个桌面时钟

一共有三个类:

这个是第一个,主函数类:

public class Programe extends JFrame {
    /*
     * 四个部分: 1.画出窗体和面板 2.画出指针 3.时间转换的算法 4.让指针动起来
     */
    public static void main(String[] string) {
        Programe frame = new Programe();// 创建窗体对象
        frame.setVisible(true);// 设置窗体可见,没有该语句,窗体将不可见,此语句必须有,否则没有界面就没有意义
    }

    public Programe() {
        setUndecorated(false);// 打开窗体修饰
        setAlwaysOnTop(true);// 窗体置顶
        getContentPane().setLayout(new BorderLayout()); // 在窗体的基础上加入面板:Panel   而后就可以在面板上进行其他操作
                                                        // 指定的组件之间的水平间距构造一个边界布局
        setBounds(100, 30, 217, 257);// 用于设置窗口尺寸和位置;
        ClockPaint clockPaint = new ClockPaint();// 创建时钟面板
        getContentPane().add(clockPaint);

        new Thread() {// 继承Thread类创建线程,更新时钟面板界面
            @Override
            public void run() {// 重写run方法
                try {
                    while (true) {
                        sleep(1000);// 休眠1秒
                        clockPaint.repaint();// 重新绘制时钟面板界面
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();// 在命令行打印异常信息在程序中出错的位置及原因。
                }
            }
        }.start();
    }
}

这个是第二个,画时钟的类:

package clock;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.ImageIcon;
import javax.swing.JPanel;

public class ClockPaint extends JPanel {
    private static final BasicStroke H = new BasicStroke(4);// 指针粗细
    private static final BasicStroke M = new BasicStroke(3);
    private static final BasicStroke S = new BasicStroke(2);
    private final static int secLen = 60; // 指针长度
    private final static int minuesLen = 55;
    private final static int hoursLen = 36;
    ImageIcon background;// 背景
    private int X;// 中心坐标
    private int Y;

    public ClockPaint() {
    
        background = new ImageIcon(getClass().getResource("时钟.jpg"));// 加载图片
        int Width = background.getIconWidth();// 获取图片宽度
        X = Width / 2 + 2;// 获取图片中间坐标
        int Height = background.getIconHeight();// 获取图片长度
        Y = Height / 2 - 8;// 获取图片中间坐标
        setPreferredSize(new Dimension(Width, Height));// 设置最好的大小(固定用法)
    }

    public void paint(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
        g2.drawImage(background.getImage(), 0, 0, this);
        ClockData data = new ClockData(secLen, minuesLen, hoursLen);
        // 绘制时针
        g2.setStroke(H);// 设置时针的宽度
        g2.setColor(Color.RED);// 设置时针的颜色
        g2.drawLine(X, Y, X + data.hX, Y - data.hY);// 绘制时针
        // 绘制分针
        g2.setStroke(M);// 设置分针的宽度
        g2.setColor(Color.orange);// 设置时针的颜色
        g2.drawLine(X, Y, X + data.mX, Y - data.mY);// 绘制分针
        // 绘制秒针
        g2.setStroke(S);// 设置秒针的宽度
        g2.setColor(Color.GREEN);// 设置时针的颜色
        g2.drawLine(X, Y, X + data.sX, Y - data.sY);// 绘制秒针
        // 绘制中心圆
        g2.setColor(Color.BLUE);
        g2.fillOval(X - 5, Y - 5, 10, 10);

    }
}

这个是第三个,获取时钟的数据:

package clock;


import static java.util.Calendar.HOUR;
import static java.util.Calendar.MINUTE;
import static java.util.Calendar.SECOND;

import java.util.Calendar;

public class ClockData {
    public int sX, sY, mX, mY, hX, hY;

    public ClockData(int secLen, int minuesLen, int hoursLen) {
        Calendar calendar = Calendar.getInstance();// 获取日历对象
        int sec = calendar.get(SECOND);// 获取秒值
        int minutes = calendar.get(MINUTE);// 获取分值
        int hours = calendar.get(HOUR);// 获取时值
        // 计算角度
        int hAngle = hours * 360 / 12 + (minutes / 2) ;// 时针角度(每分钟时针偏移角度)
        int sAngle = sec * 6; // 秒针角度
        int mAngle = minutes * 6 + (sec / 10);// 分针角度
        // 计算秒针、分针、时针指向的坐标
        sX = (int) (secLen * Math.sin(Math.toRadians(sAngle)));// 秒针指向点的X坐标(将角度转换为弧度)
        sY = (int) (secLen * Math.cos(Math.toRadians(sAngle))); // 秒针指向点的Y坐标
        mX = (int) (minuesLen * Math.sin(Math.toRadians(mAngle))); // 分针指向点的X坐标
        mY = (int) (minuesLen * Math.cos(Math.toRadians(mAngle))); // 分针指向点的Y坐标
        hX = (int) (hoursLen * Math.sin(Math.toRadians(hAngle))); // 时针指向点的X坐标
        hY = (int) (hoursLen * Math.cos(Math.toRadians(hAngle))); // 时针指向点的Y坐标

    }

}

以上参考了其他大佬的代码,等我找到原地址再补上:D

做了部分修改,加了部分注释,java小白还请客官您多多包含呀!

posted @ 2021-12-12 23:17  夏莱发电厂的Sensei  阅读(457)  评论(0)    收藏  举报