`
luoweifu
  • 浏览: 63376 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

很多人可能对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

分享到:
评论

相关推荐

    可拖动的悬浮时钟,显示秒,可以自定义字体大小和颜色

    1,可以悬浮在桌面上,悬浮在其它程序之上,透明底色,不会遮挡其它程序界面; 2,可以将时钟拖动到桌面任何地方; 3,可以显示秒的跳动(采用电脑本身的时间) 4,可以自定义时钟的字体、字体大小和字体颜色–...

    桌面透明时钟小程序

    【桌面透明时钟小程序】是一款基于C++编程语言开发的小应用程序,它能在用户的桌面上创建一个透明的时钟显示,为用户提供便捷的时间查看方式。这个程序的独特之处在于其透明特性,使得用户可以在查看时间的同时,不...

    水晶桌面时钟24小时模式

    2. **Crystal.exe**:这是水晶桌面时钟的可执行文件,双击后可以在Windows操作系统上运行此软件。这个文件包含了所有程序的核心功能,包括时间显示、大小调整、关闭操作等。 安装和使用这款时钟软件非常简单,只需...

    可拖拽时钟

    "可拖拽时钟"是一种独特的时间管理工具,它的核心特性是用户可以通过鼠标或触摸屏直接在屏幕上拖动时钟来调整时间显示位置,增加了使用的便捷性和个性化体验。这种时钟设计通常适用于桌面操作系统、移动设备甚至网页...

    一个可以拖动的时钟

    用flash做的一个小钟表,分针和时针可以拖动。用来给小学生教学钟表使用。

    简易桌面时钟

    综上所述,“简易桌面时钟”凭借其易于操作、自由拖动和透明度可调的特性,成为了一款高效且美观的时间管理工具。它能够无缝地融入用户的日常电脑使用之中,提升工作和生活的效率。对于追求高效工作和高质量生活的...

    C# 写的Vista桌面时钟(源代码)

    在本文中,我们将深入探讨如何使用C#编程语言创建一个Vista风格的桌面时钟,同时实现半透明效果。这个项目对于那些想要学习C# WinForm应用程序开发,特别是对窗体美化感兴趣的开发者来说,是非常有价值的。 首先,...

    C#时钟,可以拖动

    在本文中,我们将深入探讨如何使用C#编程语言和GDI+(图形设备接口)来创建一个可拖动的时钟应用。C#是一种广泛应用于Windows桌面应用开发的强大语言,而GDI+则是.NET Framework中用于图形绘制的核心库,允许开发者...

    VB桌面顶置时钟

    这款时钟的特点在于其透明背景设计,使得用户在使用电脑工作或娱乐时,时钟可以始终置顶显示而不会遮挡视线,对桌面的其他操作影响极小。此外,为了帮助用户养成良好的作息习惯,该时钟还特别设置了在每天0点到1点...

    左面小时钟( MyClock)

    本篇文章将深入探讨如何使用Java的JWindow组件来实现一个可以自由拖动的桌面小时钟——"MyClock"。我们将详细介绍JWindow的特性,以及如何结合日期和时间处理功能,创建这样一个实时更新的时钟应用。 首先,JWindow...

    windows 桌面时钟

    在IT领域,Windows桌面时钟是一个常见的应用,它通常是用编程语言实现的,例如C++。这个特定的项目,名为“Windows桌面时钟”,显然基于Microsoft Foundation Class (MFC)库构建,这是一个由微软提供的C++类库,专门...

    多功能时钟,桌面小助手

    【标题】:“多功能时钟,桌面...对于初学者来说,这是一个很好的学习资源,可以帮助他们了解如何使用C#构建功能丰富的桌面应用程序。通过分析和研究源代码,初学者可以加深对C#语言特性和Windows桌面开发的理解。

    js 模拟手机桌面,拖拽、合并文件、换位置

    如果需要将合并的文件下载到本地,可以使用`URL.createObjectURL`创建一个URL,然后用`a`标签的`download`属性实现。 三、换位置 换位置通常涉及重新排列元素的位置,这在JavaScript中可以通过DOM操作实现。获取...

    vc++桌面时钟小程序的实现

    在本文中,我们将深入探讨如何使用Microsoft Visual C++(简称VC++)开发一款桌面时钟小程序,该程序具有托盘功能、窗口可移动性,并且时间显示延迟在一秒以内。我们将涉及的关键技术包括Windows API编程、多线程、...

    拖拽设置时间的时钟

    "拖拽设置时间的时钟"是一个创新的设计概念,它允许用户通过直接拖动来调整时间,而不是传统的点击或输入数字的方式。这种方式更加直观且易用,尤其适用于触摸屏设备。 首先,我们要理解这个时钟的工作原理。它可能...

    桌面插件 桌面概念时钟 XinBSConceptClock.7z

    它支持在桌面上自由拖动,用户可以根据自己的需求调整时钟的位置,使其始终处于视线最舒适的地方。同时,该时钟还具备锁定功能,避免因误操作而影响到其他工作。这一人性化的设计考虑到了用户在使用过程中的实际需求...

    Android类似桌面应用拖动的GridView

    "Android类似桌面应用拖动的GridView"是指一个特殊定制的GridView,它模仿了Android桌面应用的交互方式,允许用户通过拖放操作来改变GridView中各个元素的位置。这种功能在创建自定义启动器、文件管理器或个性化布局...

    安卓Launcher桌面相关-android桌面拖拽效果.rar

    在Android中,Drag and Drop(拖放)是一种交互方式,让用户可以通过触摸屏或物理按键将一个对象(如图标、文本或图片)从一处移动到另一处。在Launcher中,这个功能主要应用于移动应用快捷方式、小部件或文件夹的...

    C# 写的一个很好看的时钟(有源程序)

    在本文中,我们将深入探讨如何使用C#编程语言创建一个美观的时钟应用程序。C#是一种面向对象的、类型安全的编程语言,广泛应用于Windows桌面应用开发,游戏开发以及更复杂的系统。对于初学者而言,学习C#创建时钟是...

    桌面时钟日历显示软件TitleBarClock Pro汉化版.rar

    要更改桌面时钟位置垂直,你只需要左键单击桌面上的时钟(它的字母之一),并按住鼠标左键向下拖动桌面时钟所需要的新的垂直位置。时钟颜色或透明度的变化不会生效,直到单击“设置”按键。可设置语音报时类别,如每...

Global site tag (gtag.js) - Google Analytics