文档章节

用JWidow写一个可以在桌面上拖动的小时钟

自由的角马
 自由的角马
发布于 2015/01/10 13:57
字数 719
阅读 7
收藏 0

很多人可能对JWidow的使用不太清楚,下面就对JWidow写的一个小例子供参考!


import java.awt.*;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.net.URL;
import java.util.Calendar;

import javax.swing.*;
/**
 * 用于显示时钟
 * @author 罗伟富
 *
 */
public class ShowClock extends JWindow implements Runnable, ActionListener{
	/**
	 * 窗口的宽度
	 */
	public static final int WIDTH = 300;
	/**
	 * 窗口的宽度
	 */
	public static final int HEIGHT = 330;
	/**
	 * 时钟的宽度
	 */
	public static final int CWIDTH = 300;
	/**
	 *时钟的高度
	 */
	public static final int CHEIGHT = 300;
	/**
	 * 关闭按钮的宽度
	 */
	public static final int CLOSEWIDTH = 30;
	/**
	 * 关闭按钮的宽度
	 */
	public static final int CLOSEHEIGHT = 30;
	/**
	 *  度数转换成弧度的比例
	 */
	final double RAD = Math.PI / 180; 
	/**
	 * 时针、分针、秒针的参考半径
	 */
	public static final int R = 120;
	
	private CalendarTime calTime;
	private Image img;
	private JPanel clockPanel;
	private JButton closeButton;
	private Thread thread;
	private boolean isWorking = true;
	//原点,半径(时、分、秒),角度,
	private int ox, oy, r, h, m, s, hh, mm, ss;
	private int X = 0, Y = 0;
	
	/**
	 * 构造函数
	 * @param calTime Calendar对象,用于计时
	 * @param img 用于作为背景的图像
	 */
	public ShowClock(CalendarTime calTime, Image img) {
		this.calTime = calTime;
		this.img = img;
		thread = new Thread(this);
		thread.start();
		initialize();
	}
	/**
	 * 为true,则计时器在计时,否则不计时
	 * @return  为true,则计时器在计时,否则不计时
	 */
	public boolean isWorking() {
		return isWorking;
	}
	/**
	 * 设置isWork的状态
	 * @param isWorking
	 */
	public void setWorking(boolean isWorking) {
		this.isWorking = isWorking;
	}
	/**
	 * 初始化组件
	 */
	public void initialize() {
		ox = 150;
		oy = 150;
		final ImageIcon originalImg = new ImageIcon(this.getClass().getResource("/Images/close1.gif"));
		final ImageIcon rolloverImg = new ImageIcon(this.getClass().getResource("/Images/close2.gif"));
		closeButton = new ImageButton(originalImg);
		closeButton.setRolloverIcon(rolloverImg);
		closeButton.addActionListener(this);
		clockPanel = new PaintPanel();
		clockPanel.setPreferredSize(new Dimension(CWIDTH, CHEIGHT));
		JLabel emptyLabel = new JLabel();
		emptyLabel.setPreferredSize(new Dimension(WIDTH-CLOSEWIDTH, CLOSEHEIGHT));
		Container c = getContentPane();
		c.setLayout(new GridBagLayout());
		GridBagConstraints gbc = new GridBagConstraints();
		gbc.gridx = 0;
		gbc.gridy = 0;
		gbc.gridwidth = 1;
		gbc.gridheight = 1;
		gbc.fill = gbc.HORIZONTAL;
		gbc.anchor = gbc.CENTER;
		c.add(emptyLabel, gbc);
		gbc.gridx = 1;
		gbc.gridy = 0;
		c.add(closeButton, gbc);
		gbc.gridx = 0;
		gbc.gridy = 1;
		gbc.gridwidth = 2;
		c.add(clockPanel, gbc);
		setSize(WIDTH, HEIGHT);
		addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent e) {
				X = e.getX();
				Y = e.getY();
			}
		}
		);
		addMouseMotionListener(new MouseAdapter() {
			public void mouseDragged(MouseEvent e) {
				setLocation(getLocation().x + (e.getX()-X),getLocation().y + (e.getY()-Y));
			}
		}
		);
	}
	/**
	 * 每隔一秒中刷新一次显示时钟的屏幕
	 */
	public void run() {
		try {
			while(isWorking) { 
				Thread.sleep(1000);
				clockPanel.repaint();
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	/**
	 * 
	 */
	public void actionPerformed(ActionEvent e) {
		if(e.getSource() == closeButton) {
			setVisible(false);
		}
	}
	
	public static void main(String[] args) {
		URL urlImg = ShowClock.class.getResource("/Images/clock.jpg");
		Image imgClock = Toolkit.getDefaultToolkit().getImage(urlImg);
		ShowClock showclock = new ShowClock(new CalendarTime(), imgClock);
		showclock.setLocationRelativeTo(null);
		showclock.setVisible(true);
	}
	/**
	 * 用于画时钟的JPanel面板
	 */
	class PaintPanel extends JPanel {
		public void paint(Graphics g) {
			super.paint(g);
			Graphics2D g2 = (Graphics2D)g;
			g2.drawImage(img, 0, 0, CWIDTH, CHEIGHT, this);
			 h = calTime.get(Calendar.HOUR);
			 m = calTime.get(Calendar.MINUTE);
			 s = calTime.get(Calendar.SECOND);
			 ss = 90-6*s;
			 mm = 90-(6*m+s/10);	//即 mm = 90-(6*m+6*(s/60));
			 hh = 90-(30*h+m/2);	//即hh = 90-30*(m/60);
			 g2.setStroke(new BasicStroke(1.0f));
			 g2.setColor(Color.red);
			 int x1 = (int)(0.8*R*Math.cos(ss*RAD)) + ox;
			 int y1 = (int)(0.8*R*Math.sin(ss*RAD)) + oy;
			 g2.drawLine(ox, oy, x1, CHEIGHT-y1);
			 
			 g2.setStroke(new BasicStroke(2.0f));
			 g2.setColor(new Color(138, 43, 226));
			 int x2 = (int)(0.7*R*Math.cos(mm*RAD)) + ox;
			 int y2 = (int)(0.7*R*Math.sin(mm*RAD)) + oy;
			 g2.drawLine(ox, oy, x2, CHEIGHT-y2);
			 
			 g2.setStroke(new BasicStroke(5.0f));
			 g2.setColor(Color.black);
			 int x3 = (int)(0.5*R*Math.cos(hh*RAD)) + ox;
			 int y3 = (int)(0.5*R*Math.sin(hh*RAD)) + oy;
			 g2.drawLine(ox, oy, x3, CHEIGHT-y3);
		}
	}
}

这里用到了其他的一些类,由于篇幅的原因,就不往上贴了。源代码下载地址:

http://download.csdn.net/download/luoweifu/4590710

本文转载自:http://blog.csdn.net/luoweifu/article/details/8010565

自由的角马
粉丝 1
博文 269
码字总数 0
作品 0
文山
私信 提问
电脑美化,告别杂乱无章的桌面

今天还是先上两张图吧,因为有新姿势想告诉你们 图片发自简书App 图片发自简书App 新姿势 先教大家如何实现滑动关闭电脑吧 其实很简单的,只需要找到C:WindowsSystem32SlideToShutDown.exe把...

一场离人梦惊醒谁
2017/12/11
0
0
android_launcher的源码详细分析

转载请注明出处:http://blog.csdn.net/fzh0803/archive/2011/03/26/6279995.aspx 去年做了launcher相关的工作,看了很长时间。很多人都在修改launcher,但还没有详细的文档,把自己积累的东...

长平狐
2012/10/09
395
0
android中的launcher介绍

一、主要文件和类 1.Launcher.java:launcher中主要的activity。 2.DragLayer.java:launcher layout的rootview。DragLayer实际上也是一个抽象的界面,用来处理拖动和对事件进行初步处理然后按...

我希冀着
2011/11/08
2.9K
1
launcher修改--launcher架构解析

要想做好launcher,对其基本的架构了解是必须的,在这篇文章里,简单的介绍下launcher中类的构成和架构,首先,这篇文章中很多资源均从互联网中获得,感谢网友们的无私奉献,大家都共享,进步...

迷途d书童
2012/03/30
18.2K
4
android中launcher工作机制介绍

一、Launcher应用程序列表内容读取过程 Launcher从onCreate函数开始执行,初始化了一些变量,调用mModel.startLoader函数进行读取工作,LauncherModel中定义了一个Loader类,该类负责读取应用...

我希冀着
2011/11/11
1K
1

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
2.1K
14
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
38
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
40
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
61
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部