(原创 by 徐剑生)《Java Swing之利用简单的多线程实现动态时钟》

注:本文仅供学习和交流

以上是截图,下面上代码

第一个类是Circle

package org.xt.util;

import java.awt.Point;

public class Circle {
    private Point centre;
    private int radius;

    public Circle(Point centre, int radius) {
        this.centre = centre;
        this.radius = radius;
    }

    public Point getCentre() {
        return centre;
    }

    public void setCentre(Point centre) {
        this.centre = centre;
    }

    public int getRadius() {
        return this.radius;
    }

    public void setRadius(int radius) {
        this.radius = radius;
    }
}

第二个类是Clock

package org.xt.clock;

import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.util.Calendar;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class Clock extends JComponent implements Runnable {
    private int radius;

    public Clock(int radius) {
        this.radius = radius;
    }

    public void paint(Graphics g) {
        Graphics2D g2d = (Graphics2D) g;

     //这两句话是去除线条锯齿的关键,至于原理笔者也不清楚,这两句是笔者从网络上找来的(就这两句不是自己写的,呵呵)
        g2d.setStroke(new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL));
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

     //钟盘所在的矩形的左上角的坐标
        int clockPlateX = 0;
        int clockPlateY = 0;
        g2d.setColor(Color.GRAY);

     //画两个同心圆盘,作为时钟的边框
        g2d.drawOval(clockPlateX, clockPlateY, this.radius * 2, this.radius * 2);
        g2d.drawOval(clockPlateX + 5, clockPlateY + 5, this.radius * 2 - 10, this.radius * 2 - 10);

     //圆心坐标
        int centreX = this.radius;
        int centreY = centreX;

        g2d.setStroke(new BasicStroke(0.8f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL));

     //这是钟盘中心的那个点
        g2d.fillOval(centreX - 3, centreY - 3, 6, 6);

        g2d.setStroke(new BasicStroke(2.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL));

     //以下开始画大刻度,共有12个,表示有12个小时,基准是9时所指的刻度
        double degree = 0;
        double radian = Math.toRadians(degree);
        for (int i = 0; i < 12; ++i) {

       //计算刻度线相对位置位于左边的点
            int leftX = (int) ((double) centreX - (this.radius - 15) * Math.cos(radian));
            int leftY = (int) ((double) centreY - (this.radius - 15) * Math.sin(radian));

       //计算刻度线相对位置位于右边的点
            int rightX = (int) ((double) centreX - (this.radius - 25) * Math.cos(radian));
            int rightY = (int) ((double) centreY - (this.radius - 25) * Math.sin(radian));
      
            g2d.drawLine(leftX, leftY, rightX, rightY);
            degree += 30;
       //将角度转换为弧度
            radian = Math.toRadians(degree);
        }

        g2d.setStroke(new BasicStroke(1.5f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL));
     
        //以下开始画小刻度,共有60-12=48个,基准是0时所指的刻度
        degree = 0;
        radian = Math.toRadians(degree);
        for (int i = 0; i < 60; ++i) {
         //此条件在于避免小刻度和大刻度重复
            if (i != 0 && degree % 30 != 0) {
                int leftX = (int) ((double) centreX - (this.radius - 15) * Math.cos(radian));
                int leftY = (int) ((double) centreY - (this.radius - 15) * Math.sin(radian));
                int rightX = (int) ((double) centreX - (this.radius - 17) * Math.cos(radian));
                int rightY = (int) ((double) centreY - (this.radius - 17) * Math.sin(radian));
                g2d.drawLine(leftX, leftY, rightX, rightY);
            }
        //每次增加6度
            degree += 360 / 60;
            //将角度转换为弧度
            radian = Math.toRadians(degree);
        }

     //获取当前的时,分,秒(Date类已经被淘汰,这里使用Calendar)
        Calendar cal = Calendar.getInstance();
        int second = cal.get(Calendar.SECOND);
        int minute = cal.get(Calendar.MINUTE);
        int hour = cal.get(Calendar.HOUR_OF_DAY);
        if (hour > 12) {
            hour = hour % 12;
        }

     //计算秒针当前距离开始位置的弧度,其余两句分别是分针和时针
        double secondProp = Math.toRadians(second * (360 / 60));
        double minuteProp = Math.toRadians(minute * (360 / 60));
        double hourProp = Math.toRadians((hour + minuteProp / (2 * Math.PI)) * (360 / 12));

        int leftX = (int) (centreX + (this.radius - 25) * Math.sin(secondProp));
        int leftY = (int) (centreY - (this.radius - 25) * Math.cos(secondProp));
        g2d.setStroke(new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL));
        g.drawLine(leftX, leftY, centreX, centreY);

        leftX = (int) (centreX + (this.radius - 45) * Math.sin(minuteProp));
        leftY = (int) (centreY - (this.radius - 45) * Math.cos(minuteProp));
        g2d.setStroke(new BasicStroke(1.5f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL));
        g.drawLine(leftX, leftY, centreX, centreY);

        leftX = (int) (centreX + (this.radius - 70) * Math.sin(hourProp));
        leftY = (int) (centreY - (this.radius - 70) * Math.cos(hourProp));
        g2d.setStroke(new BasicStroke(2.5f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL));
        g.drawLine(leftX, leftY, centreX, centreY);
    }

    public void run() {
        while (true) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            this.repaint();
        }
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        JPanel panel = new JPanel(new BorderLayout());
        frame.setContentPane(panel);
        Clock clock = new Clock(150);
        new Thread(clock).start();
        panel.add(clock, BorderLayout.CENTER);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(600, 400);
        frame.setVisible(true);
    }
}

呵呵,水平有限,代码写的比较乱

——写于2014-09-08 20:30:00上下

时间: 2024-11-06 16:26:17

(原创 by 徐剑生)《Java Swing之利用简单的多线程实现动态时钟》的相关文章

java swing开发最简单的浏览器源代码下载

原文:java swing开发最简单的浏览器源代码下载 源代码下载地址:http://www.zuidaima.com/share/1550463483628544.htm java swing开发最简单的浏览器,已测试.... package com.zuidaima; import org.eclipse.swt.SWT; import org.eclipse.swt.browser.Browser; import org.eclipse.swt.browser.CloseWindowLis

java swing中利用PS绘制漂亮的图形界面

首先从网上下载一些漂亮的界面:例如:要制作一个五子棋,那么就可以利用下面这个图形界面. 通过对鼠标位置的监听(主要是获取坐标)而实现不同的功能. 为界面添加鼠标监听: public class MyPicture extends JFrame implements MouseListener{} 从而获取坐标数据: public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub x=e.getX(); y=e

利用canvas画一个动态时钟

目标:利用canvas画布画一个动态时钟,根据目前的时间可以实时更新的,可以在过程中添加一些效果,比如让时钟外围的一圈颜色渐变,时钟上的数字颜色改变,时钟的指针颜色改变... 设置一个定时器 先放上一张效果图,参考一下 先建一个画布,写好样式 <style type="text/css"> *{ margin: 0; padding: 0; } div{ //设置div的text-align为center,margin-top text-align: center; mar

Atitit。D&amp;D drag&amp;drop拖拽功能c#.net java swing的对比与实现总结

Atitit.D&D drag&drop拖拽功能c#.net java swing的对比与实现总结 1. 实现一个D&D操作一般包括三个步骤: 1 2. .net黑头的拖曳机制.必须有DragEnter事件(单独写DragDrop事件是不会具有拖拽功能的) 2 3. ---java黑头的拖曳..必须有DragEnter事件(单独写 Drop事件是不会具有拖拽功能的) 2 4. 代码 3 5. 参考 5 1. 实现一个D&D操作一般包括三个步骤: 首先实现一个拖拽源,这个拖拽

Java Swing 使用总结(转载)

随笔转载自:此去经年ぢ 地址:http://www.cnblogs.com/FLFL/p/5369756.html 1.     GUI编程引言 以前的学习当中,我们都使用的是命令交互方式: 例如:在DOS命令行中通过javac java命令启动程序. 软件的交互的方式:   1. 命令交互方式    图书管理系统 2. 图形交互方式 ava提供了专业的API用于开发图形用户界面 GUI--> Graphic  User   Interface   将要了解GUI API的框架结构,以及GUI组

Java Swing创建自定义闪屏:在闪屏上添加Swing进度条控件(转)

本文将讲解如何做一个类似MyEclipse启动画面的闪屏,为Java Swing应用程序增添魅力. 首先看一下效果图吧, 原理很简单,就是创建一个Dialog,Dialog有一个进度条和一个Label用来分别显示进度和进度信息,而Dialog的宽度和高度正是闪屏图片的宽度和高度.然后将闪屏图片贴到Dialog中作为整个窗体的背景,Dialog显示时覆盖闪屏所处的区域.由于Dialog显示时闪屏并没有消失,且Dialog的X.Y及宽高都与闪屏图片一致,因此实际切换时,非常流畅,用户感觉不到有异常,

Java swing 之 标签控件 和 图标控件的使用

在Swing 中显示文本或提示信息的方法是使用标签,它支持文本字符串和图标.在应用程序的用户界面中,一个简短的文本标签可以使用户知道这些控件的目的,所以标签在Swing中是比较常用的控件. 1.标签的使用 标签由JLabel类定义,父类为JComponent类. 标签可以显示一行只读文本,一个图像或带图像的文本,它并不能产生任何类型的事件,只是简单低显示文本和图片,但是可以使用标签的特性指定标签上文本的对齐方式. JLabel类提供了多种构造方法,这样可以创建多种标签,例如显示只有文本的标签.只

Java swing项目-图书管理系统(swing+mysql+jdbc) 总结

(一)java Swing的学习. (1)学习如何安装windowbuilder插件的安装. <1>在eclipse中点击help <2>在help的下拉选中选择install new software,弹出插件的添加界面 <3>点击add,在弹出如下界面: <4>在name栏输入windowbuider 在location中输入如下地址:http://download.eclipse.org/windowbuilder/WB/release/R201506

Java Swing版单机版三国杀

原文:Java Swing版单机版三国杀 源代码下载地址:http://www.zuidaima.com/share/1584513538509824.htm 版权声明:本文为博主原创文章,未经博主允许不得转载.