- 浏览: 473002 次
- 性别:
- 来自: 南京
-
文章分类
最新评论
-
a1439226817:
能不能发下源码1439226817@qq.com
ExtJsCRUD组件实现 -
w923690968:
[list][*]引用[u][/u][/list]
[JS]Drag And Drop -
zhumingyuan:
您好!用的的是3.2.3版本,按照您的方法配置了一下,但是还是 ...
spring vmc3.1.1 下,通过AnnotationMethodHandlerAdapter配置webBindingInitializer失效解决方案 -
sumo084:
我把xDarkness-MultClrBubble-1.0.j ...
JAVA实现类泡泡屏保效果 -
sumo084:
求源码,楼主好人,630483738@qq.com,谢谢
JAVA实现类泡泡屏保效果
说明:
由于个人精力有限,现将部分研究的代码开源出来,
代码或思路有部分来源于网络,有些代码还没来得及整理,
如果您对这其中的部分代码、思路整理出了一些文档,希望您能够联系我,分享您的成果
我将在下一版中更新您提供的一些文档.
开源不是靠一个人的坚持能完成的事,希望在不涉及版权问题的情况下,贡献您一份力量
版权归原作者所有,如果您有什么好的想法或建议,欢迎联系我
AutoHiddenFrame.java
WindowLocationListener.java
WindowMouseListener.java
WindowMover.java
测试:
效果:
由于个人精力有限,现将部分研究的代码开源出来,
代码或思路有部分来源于网络,有些代码还没来得及整理,
如果您对这其中的部分代码、思路整理出了一些文档,希望您能够联系我,分享您的成果
我将在下一版中更新您提供的一些文档.
开源不是靠一个人的坚持能完成的事,希望在不涉及版权问题的情况下,贡献您一份力量
版权归原作者所有,如果您有什么好的想法或建议,欢迎联系我
AutoHiddenFrame.java
package com.xdarkness.swing.autohidden; import java.awt.BorderLayout; import java.awt.GraphicsConfiguration; import java.awt.GraphicsEnvironment; import java.awt.Insets; import java.awt.Point; import javax.swing.JFrame; import javax.swing.JPanel; /** * @author Darkness * @version 1.0 * @since JDF 1.0 */ public class AutoHiddenFrame extends JFrame { private static final long serialVersionUID = 1L; protected GraphicsConfiguration translucencyCapableGC;// 图形环境 private AHFBodyState state = AHFBodyState.NORMAL; // 窗体的状态,让它初始化为普通状态 private Point hiddenPoint; // 隐藏窗体时,窗体的位置 private Point visiblePoint; // 窗体处于显示状态时的位置 public AutoHiddenFrame() { // 获取系统图形环境 translucencyCapableGC = GraphicsEnvironment .getLocalGraphicsEnvironment().getDefaultScreenDevice() .getDefaultConfiguration(); setContentPane(new JPanel(new BorderLayout()) { private static final long serialVersionUID = 1L; public Insets getInsets() { return new Insets(3, 3, 3, 3); } }); // 替换掉原来的ContentPane,换上一个带有Insets的,至于为什么去看WindowMouseListener类 new WindowLocationListener(this); new WindowMouseListener(this); //WindowLocationListener.checkAutoHiddenState(this);// 刚出来就检查一下窗体的位置 } protected int FWidth; protected int FHeight; @Override public void setSize(int width, int height) { super.setSize(width, height); FWidth = width; FHeight = height; } /** * @param newState * 新的状态 一定要是此类中定义的3中状态之一 */ public void setStates(AHFBodyState newState) { state = newState; } /* * 返回状态,注意此方法和setStates方法区别与JFrame中的setState()和getState()方法 */ public AHFBodyState getStates() { return state; } /* * 设置要显示时窗体的坐标 */ public void setVisiblePoint(Point point) { visiblePoint = point; } /* * 设置要隐藏是窗体的坐标 */ public void setHiddenPoint(Point point) { hiddenPoint = point; } public void moveToVisible() { if (visiblePoint != null) { WindowMover.moveToPoint(this, visiblePoint); setStates(AHFBodyState.CANHIDD); } } public void moveToHidden() { if (hiddenPoint != null) { WindowMover.moveToPoint(this, hiddenPoint); setStates(AHFBodyState.HIDDEN); } } public void setMoveFrames(int frames){ WindowMover.FRAMES = frames; } } /** * 窗体状态 * @author Darkness * @version 1.0 * @since JDF 1.0 */ class AHFBodyState { private String bodyState; AHFBodyState(String bodyState) { this.bodyState = bodyState; } public static final AHFBodyState NORMAL = new AHFBodyState("nomal"); // 窗体的普通状态 public static final AHFBodyState CANHIDD = new AHFBodyState("can hid"); // 窗体位于屏幕边缘,可以隐藏的状态 public static final AHFBodyState HIDDEN = new AHFBodyState("hidden"); // 窗体处于隐藏状态 public String toString() { return bodyState; } }
WindowLocationListener.java
package com.xdarkness.swing.autohidden; import java.awt.Dimension; import java.awt.Point; import java.awt.Toolkit; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; /** * 为窗体添加控制窗口是否隐藏的监听器 判断窗体的位置,更新显示、隐藏的点,及窗体的状态 * * @author Darkness * @version 1.0 * @since JDF 1.0 * */ public class WindowLocationListener extends ComponentAdapter { public static final int HIDDEN_BOUND = 3; // 当窗体进入到屏幕边缘3像素以内就可以隐藏 public static final int VISIBLE_BOUND = 5; // 当窗体隐藏后要有5像素的部分露出来,不能完全隐藏 AutoHiddenFrame frame; public WindowLocationListener(AutoHiddenFrame a) { frame = a; frame.addComponentListener(this); } public void componentMoved(ComponentEvent e) { checkAutoHiddenState(frame);// 当窗体移动就调用检查方法; } /** * 判断窗体的位置,更新显示、隐藏的点,及窗体的状态 * * @param frame */ public static void checkAutoHiddenState(AutoHiddenFrame frame) { // 当窗体状态不是隐藏的,再进行检查 if (frame.getStates() == AHFBodyState.HIDDEN) { return; } // 首先获得屏幕的大小和窗体的坐标 Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); Point hiddenPoint = frame.getLocation(); Point visiblePoint = null; boolean canhidden = false; System.out.println("hiddenPoint before:" + hiddenPoint); // 当窗体位于左边边缘 if (hiddenPoint.x <= HIDDEN_BOUND) { hiddenPoint.move(VISIBLE_BOUND - frame.FWidth, hiddenPoint.y); visiblePoint = new Point(0, hiddenPoint.y); canhidden = true; } // 当窗体位于上边 else if (hiddenPoint.y <= HIDDEN_BOUND) { hiddenPoint.setLocation(hiddenPoint.x, VISIBLE_BOUND - frame.FHeight); visiblePoint = new Point(hiddenPoint.x, 0); canhidden = true; } // 当窗体位于右边 else if (hiddenPoint.x + frame.getWidth() >= screenSize.width - HIDDEN_BOUND) { hiddenPoint.setLocation(screenSize.width - VISIBLE_BOUND, hiddenPoint.y); visiblePoint = new Point(screenSize.width - frame.FWidth, hiddenPoint.y); canhidden = true; } System.out.println("hiddenPoint after:" + hiddenPoint); if (canhidden) { // 如果符合以上几种情况的一种就可以隐藏 frame.setVisiblePoint(visiblePoint); frame.setHiddenPoint(hiddenPoint); frame.setStates(AHFBodyState.CANHIDD); System.out.println("进入可隐藏区域!"); } else { // 如果不可以隐藏,那就是离开了边缘了 if (frame.getStates() == AHFBodyState.CANHIDD) { System.out.println("离开可应藏区域!"); } frame.setVisiblePoint(frame.getLocation()); frame.setStates(AHFBodyState.NORMAL); } } }
WindowMouseListener.java
package com.xdarkness.swing.autohidden; import java.awt.Container; import java.awt.MouseInfo; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowEvent; import java.awt.event.WindowFocusListener; import javax.swing.SwingUtilities; import javax.swing.Timer; /** * 为窗体添加鼠标事件监听器 * * @author Darkness * @version 1.0 * @since JDF 1.0 */ public class WindowMouseListener extends MouseAdapter implements ActionListener, WindowFocusListener { private Timer timer; private AutoHiddenFrame frame; Container container; public WindowMouseListener(AutoHiddenFrame a) { frame = a; container = frame.getContentPane(); container.addMouseListener(this); // 注册鼠标侦听器到ContentPane上,因为我们可以加大它的Insets以提高鼠标进入和离开的灵敏度 frame.addWindowFocusListener(this); // 注册一个焦点侦听器到窗体上 timer = new Timer(2000, this); timer.setRepeats(false); } public void mouseEntered(MouseEvent e) { // 当鼠标进入,就显示窗体 if (frame.getStates() == AHFBodyState.HIDDEN) { frame.moveToVisible(); } } public void mouseExited(MouseEvent e) { // 当鼠标离开,启动计时器 if (frame.getStates() == AHFBodyState.CANHIDD) { if (!container.contains(e.getPoint())) { System.out.println(timer.getDelay() / 1000 + "秒后自动隐藏窗口!"); timer.restart(); } } } public void actionPerformed(ActionEvent e) { // 计时器到期,检查鼠标是不是还在此窗体里面,不再的话,再开始隐藏 Point p = MouseInfo.getPointerInfo().getLocation(); SwingUtilities.convertPointFromScreen(p, container); if (!container.contains(p) && frame.getStates() == AHFBodyState.CANHIDD) { frame.moveToHidden(); } } public void windowGainedFocus(WindowEvent e) { // 得到焦点检查鼠标是不是在窗体上 Point p = MouseInfo.getPointerInfo().getLocation(); SwingUtilities.convertPointFromScreen(p, container); if (container.contains(p) && frame.getStates() == AHFBodyState.HIDDEN) { frame.moveToVisible(); } } public void windowLostFocus(WindowEvent e) { // 失去焦点,启动计时器 if (frame.getStates() == AHFBodyState.CANHIDD) { System.out.println("2秒后自动隐藏窗口!"); timer.restart(); } } }
WindowMover.java
package com.xdarkness.swing.autohidden; import java.awt.Point; import java.awt.event.ComponentListener; import javax.swing.JFrame; /** * 用来提示将要隐藏的线程 * * @author Darkness * @version 1.0 * @since JDF 1.0 */ public class WindowMover extends Thread { public static void moveToPoint(JFrame dialog, Point targetPoint) { new WindowMover(dialog, targetPoint).start(); } protected static int FRAMES = 15; // 最多移动多少动画帧 private JFrame window; // 要移动的窗口 private Point point; // 目的坐标 private int index; // 当前帧数 private int addedX; // 每次移动的X坐标增量 private int addedY; // 每次移动的Y坐标的增量 ComponentListener[] componentListeners;// 组件侦听器数组 /* * 定义私有的构造方法,应调用静态方法moveToPoint; */ private WindowMover(JFrame window, Point targetPoint) { this.window = window; window.getGlassPane().setVisible(true); // 设置此窗体的GlassPane为显示的,以阻止子组件接收鼠标事件,减少事件触发 // 同样,移除此窗体上的组件侦听器,防止再次触发窗体移动事件 componentListeners = window.getComponentListeners(); for (ComponentListener cl : componentListeners) { window.removeComponentListener(cl); } Point wl = window.getLocation(); point = targetPoint; index = 0; // 初始化帧书为0; // 计算每次移动量 addedX = (point.x - wl.x) / FRAMES; if (addedX == 0 && point.x != wl.x) { addedX = point.x < wl.x ? -1 : 1; } addedY = (point.y - wl.y) / FRAMES; if (addedY == 0 && point.y != wl.y) { addedY = point.y < wl.y ? -1 : 1; } } public void run() { System.out.println(window.getLocation() + "=====" + point); if (window.getLocation().equals(point)) return;// 如果已在目的点,则返回 if (!window.isVisible()) return;// 如果窗口是不可视的则返回 while (index < FRAMES) { Point p = window.getLocation(); if (p.x != point.x) p.translate(addedX, 0); if (p.y != point.y) p.translate(0, addedY); window.setLocation(p); index++; try { Thread.sleep(15); } catch (Exception e) { } } window.setLocation(point); // 还原所做的操作 window.getGlassPane().setVisible(false); for (ComponentListener cl : componentListeners) { window.addComponentListener(cl); } // 释放资源,使gc可以回收此对象 window = null; point = null; componentListeners = null; System.out.println("finsh Moved"); } }
测试:
package com.xdarkness.swing.test; import javax.swing.JFrame; import javax.swing.SwingUtilities; import com.xdarkness.swing.autohidden.AutoHiddenFrame; /** * 自动隐藏窗体测试 * @author Darkness * create on 2010-11-26 下午02:02:14 * @version 1.0 * @since JDF 1.0 */ public class AutoHiddenFrameTest extends AutoHiddenFrame { private static final long serialVersionUID = -455700849275575191L; public AutoHiddenFrameTest(){ this.setTitle("Music"); this.setSize(228, 720); this.setMoveFrames(100);// 设置自动隐藏窗体移动的帧住,数值越大,速度越慢 } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { AutoHiddenFrameTest shell = new AutoHiddenFrameTest(); shell.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); shell.setVisible(true); } }); } }
效果:





- xDarkness-swing-autoHiddenFrame-1.0.jar (14 KB)
- 下载次数: 56
发表评论
-
为学生准备的JS入门教程
2012-06-28 10:59 1713入门小测验: <html> <he ... -
SwingC API 演示DEMO,不断更新
2011-11-10 11:30 2334原文 本帖不再更新,以后发布在这儿 1、运行一个带换肤 ... -
发布swf更新版本时客户端Flash缓存问题
2011-09-26 17:18 1539本文转载自 http://uh.9ria.com/spac ... -
WebOS试探+WebIM简单演示
2011-08-19 17:06 2825原文:http://www.abigdreamer.com ... -
Swing打成jar包后,双击运行没反应,怎么查看出错信息
2010-12-01 22:04 1854打cmd 进dos环境, 进入你的jar所在目录 java - ... -
JAVA实现类泡泡屏保效果
2010-11-29 20:29 2504效果如图: ========================= ... -
高仿真QQ界面
2010-09-01 12:12 2009效果图: -
flash关注
2010-02-22 17:29 1108http://download.csdn.net/source ...
相关推荐
描述中的关键词重复强调了“仿QQ靠边隐藏窗口”和“源码”,这表明这个项目的目标是复现QQ的这一特定特性,并且提供了实现这一功能的原始代码。源码对于开发者来说是极其宝贵的,因为它允许他们深入了解特定功能的...
这可能涉及到计算新的窗口尺寸和位置,以及如何显示/隐藏窗口的边框。 以下是一个简单的实现步骤: 1. **创建Shell**:首先,创建一个Shell对象,设置其基本属性,如标题、大小和位置。 2. **添加ResizeListener*...
这个标题"自动隐藏(类似QQ隐藏)"所指的就是这种技术,通常用于即时通讯软件如QQ,当窗口靠近屏幕边缘时,程序会自动缩至屏幕边缘不可见,释放屏幕空间,而当鼠标靠近时又会重新出现,提供便捷的操作体验。...
在描述中提到的“窗体拖动到左、右、上边界时进行动画效果隐藏”,意味着当用户将窗口边缘靠近屏幕边界时,会有一个平滑的动画过程来实现窗体的隐藏。这种动画效果不仅增加了用户体验,也使得界面变化更为自然。而...
在Windows系统中,可以通过API函数实现窗口的最小化、最大化和隐藏。例如,使用ShowWindow()函数可以控制窗口的可见性。 3. **任务栏图标集成**:闹钟程序能在任务栏上显示图标并响应右键菜单,这需要理解Windows...
// 窗口类型 windowManagerParams.type = LayoutParams.TYPE_PHONE; // 背景透明 windowManagerParams.format = PixelFormat.RGBA_8888; // 非触摸模式,非聚焦 windowManagerParams.flags = LayoutParams....
(16)系统设置:开机自动启动、麦克风设备索引、摄像头设备索引,叉掉主窗口时关闭程序还是隐藏窗口。 (17)聊天记录:支持本地保存和服务器端保存两种方式。 (18)好友分组:新增/删除分组,修改分组名称,改变...