ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:223.85KB ,
资源ID:5397531      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-5397531.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(透明界面实现.docx)为本站会员(b****3)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

透明界面实现.docx

1、透明界面实现想做一个透明的界面,无奈Java中的虽然有JFrame.setOpacity();但是这个东西,不好用。后来发现是通过抓取屏幕背景作为自己的背景图片。然后实现伪透明。桌面背景是很有可能更换的,因此要在适当的时机抓取新的屏幕背景最为自己的背景。这个似乎可以用线程来实现,但是感觉很消耗资源,毕竟桌面背景不是每隔一段时间就更新的。先解释一个屏幕绘制的这个过程。首先是抓取整个屏幕,然后我们选择合适的坐标,将我们的界面所覆盖的那一部分屏幕区域,绘制上去。这样当我们的界面移动时,只要修改适当的坐标,以取得当前覆盖的屏幕区域进行绘制。下面是这个代码片段。有一个地方在解释一下。 Java代码 1

2、Override 2 3 public void paintComponent(Graphics g) 4 5 super.paintComponent(g); 6 7 /this.paint(g); 8 9 10 11 Point pos = this.getLocationOnScreen(); 12 13 Point offset = new Point(-pos.x, -pos.y); 14 15 / 有一个问题就是为什么这边要用复数 16 17 g.drawImage(background, offset.x, offset.y, null); 18 19 我们看到这个 offset

3、.x和offset.y是负数,也许我们感到困惑。这个只要搞张图片,用这个方法放在JFrame上,实现一下就明白了。 我们分析一下抓取屏幕背景的过程:当我们的界面抓取屏幕背景并作为自己的背景进行绘制后,如果屏幕的背景发生了变化,那么一定是我们的界面失去了焦点。这个时候操作的不在是我们的界面,因此可以将其隐藏起来。而当我们要操作我们的界面时,即获得焦点时,我们这时候再抓取屏幕背景就可以了。因此不需要用线程的,用监听器就可以。除了要用到焦点的监听器之外,我们还需要组件监听器,这个是监听界面的移动,大小的变化等,以及时重绘。这个思路是没有问题的。在实现的过程中可能会出现一些小问题。一些让我们头痛的BU

4、G。第一个BUG:我们可能会把自己本身作为背景的一部分抓取过来,这就露馅了。于是当我们的界面失去焦点时,我们必须把这个界面隐藏起来,放在屏幕之外的位置。这样抓取的时候,就不会露馅了。第二个BUG:我们思路是这样的,windowsGainedFocus(WindowEvent e)即得到焦点的监听器,方法的内容是这样的,抓取屏幕背景,进行重绘。windowsLostFocus(WindowEvent e)失去焦点监听器,方法的内容是,将界面隐藏起来。我们的步骤是这样的,我们抓取屏幕背景是在这样的情况发生的,我们失去了焦点,界面隐藏,然后得到焦点,抓取屏幕,绘制屏幕。但是这个步骤在程序运行刚开始时

5、是不成立的,即程序一开始我们就直接得到了焦点,这个时候我们抓取屏幕,但是由于我们的界面还没有来的及隐藏,这就会出现第一个BUG的情况。解决方法是:设置一个标志fresh,是否抓取屏幕。还有第三个BUG。这个我们先等一下,看一下解决了上述两个问题之后的效果。下面是完整代码(两个类): :Java代码 20 package transparentUI2; 21 22 import java.awt.Point; 23 import java.awt.event.ComponentEvent; 24 import java.awt.event.ComponentListener; 25 import

6、 java.awt.event.MouseEvent; 26 import java.awt.event.MouseListener; 27 import java.awt.event.WindowEvent; 28 import java.awt.event.WindowFocusListener; 29 30 import javax.swing.JFrame; 31 32 public class TestUI extends JFrame implements WindowFocusListener, 33 ComponentListener 34 private JPaneUI jp

7、; 35 private boolean fresh = false; 36 private Point tem_point; 37 38 39 public static void main(String args) 40 new TestUI(); 41 42 43 public TestUI() 44 this.setSize(200, 300); 45 this.setLocationRelativeTo(null); 46 this.setDefaultCloseOperation(3); 47 jp = new JPaneUI(); 48 this.add(jp); 49 this

8、.addComponentListener(this); 50 this.addWindowFocusListener(this); 51 52 this.setVisible(true); 53 54 55 56 Override 57 public void windowGainedFocus(WindowEvent e) 58 / TODO Auto-generated method stub 59 this.refresh(); 60 fresh = false; 61 62 63 Override 64 public void windowLostFocus(WindowEvent

9、e) 65 / TODO Auto-generated method stub 66 67 fresh = true; 68 tem_point = this.getLocation();/ 记录屏幕消失之前的坐标 69 this.setLocation(-2000, -2000); 70 71 72 public void refresh() 73 74 if (fresh) 75 76 jp.updateBackground(); 77 / 此时P应该重新被赋值了 p存放应该就是刷新之前的位置 78 this.setLocation(tem_point); 79 if (tem_point

10、.x 0 | tem_point.y 0) 80 this.setLocation(0, 0); 81 jp.repaint(); 82 83 84 85 86 87 Override 88 public void componentResized(ComponentEvent e) 89 / TODO Auto-generated method stub 90 91 this.repaint(); 92 93 94 Override 95 public void componentMoved(ComponentEvent e) 96 / TODO Auto-generated method

11、stub 97 / this.updateBackground(); 98 this.repaint(); 99 100 101 Override 102 public void componentShown(ComponentEvent e) 103 / TODO Auto-generated method stub 104 System.out.println(是不是在执行这个方法); 105 / refresh(); 106 this.repaint(); 107 108 109 Override 110 public void componentHidden(ComponentEven

12、t e) 111 / TODO Auto-generated method stub 112 113 114 115 116 Java代码 117 package transparentUI2; 118 119 import java.awt.Dimension; 120 import java.awt.Graphics; 121 import java.awt.Image; 122 import java.awt.Point; 123 import java.awt.Rectangle; 124 import java.awt.Robot; 125 import java.awt.Toolk

13、it; 126 import java.awt.event.ComponentEvent; 127 import java.awt.event.ComponentListener; 128 import java.awt.event.WindowEvent; 129 import java.awt.event.WindowFocusListener; 130 131 import javax.swing.JFrame; 132 import javax.swing.JPanel; 133 134 public class JPaneUI extends JPanel 135 private J

14、Frame frame; 136 private Image background; 137 private Point final_point; 138 139 public JPaneUI() 140 updateBackground(); 141 142 143 / 获得当前屏幕快照 144 public void updateBackground() 145 try 146 Robot rbt = new Robot(); 147 Toolkit tk = Toolkit.getDefaultToolkit(); 148 Dimension dim = tk.getScreenSize

15、(); 149 background = rbt.createScreenCapture(new Rectangle(0, 0, (int) dim 150 .getWidth(), (int) dim.getHeight(); 151 catch (Exception ex) 152 153 154 155 156 Override 157 public void paintComponent(Graphics g) 158 super.paintComponent(g); 159 /this.paint(g); 160 161 Point pos = this.getLocationOnS

16、creen(); 162 Point offset = new Point(-pos.x, -pos.y); 163 / 有一个问题就是为什么这边要用复数 164 g.drawImage(background, offset.x, offset.y, null); 165 现在将第三个BUG:本来是这样的我们操作另一个界面时,我们的界面会失去焦点,而等到我们操作我们的界面时,我们才能获得焦点。但是现在有一个例外的情况,就是我们操作的另一个界面的最小化或者是关闭的按钮,这样我们的界面在失去焦点之后,马上得到焦点。就是因为这个时间很短,所以我们抓取屏幕的动作,抓到不改抓到的东西就是其他界面消失过程

17、中的图像。我们的界面消失有一个渐变的过程,这个过程被我们抓到了,然后的结果就是这个样子。如图: 第一张是word的界面,当最小化时,我们的界面就会捕捉到他的一个渐变的过程。这个确实很烦人。解决办法就是,遇到这种情况时,系统多抓几次屏幕。但是会出另一个问题,就是屏幕会闪烁,于是双缓冲也得来。下面是完整的代码:Java代码 166 package transparentUI; 167 168 import java.awt.Point; 169 import java.awt.event.ComponentEvent; 170 import java.awt.event.ComponentList

18、ener; 171 import java.awt.event.MouseEvent; 172 import java.awt.event.MouseListener; 173 import java.awt.event.WindowEvent; 174 import java.awt.event.WindowFocusListener; 175 176 import javax.swing.JFrame; 177 178 public class TestUI extends JFrame implements WindowFocusListener, 179 ComponentListen

19、er, MouseListener 180 private JPaneUI jp; 181 private boolean fresh = false; 182 private Point tem_point; 183 private int many_fresh; 184 185 public static void main(String args) 186 new TestUI(); 187 188 189 public TestUI() 190 this.setSize(200, 300); 191 this.setLocationRelativeTo(null); 192 this.

20、setDefaultCloseOperation(3); 193 jp = new JPaneUI(); 194 this.add(jp); 195 this.addComponentListener(this); 196 this.addWindowFocusListener(this); 197 this.addMouseListener(this); 198 this.setVisible(true); 199 200 201 202 Override 203 public void windowGainedFocus(WindowEvent e) 204 / TODO Auto-gen

21、erated method stub 205 this.refresh(); 206 fresh = false; 207 208 209 Override 210 public void windowLostFocus(WindowEvent e) 211 / TODO Auto-generated method stub 212 213 fresh = true; 214 tem_point = this.getLocation();/ 记录屏幕消失之前的坐标 215 this.setLocation(-2000, -2000); 216 217 218 public void refre

22、sh() 219 / int i=6; 220 if (fresh) 221 if(many_fresh=1) 222 jp.updateBackground(); 223 / 此时P应该重新被赋值了 p存放应该就是刷新之前的位置 224 this.setLocation(tem_point); 225 if (tem_point.x 0 | tem_point.y 1) 230 /p = this.getLocationOnScreen(); 231 this.setLocation(-2000,-2000); 232 233 jp.updateBackground(); 234 / 此时P

23、应该重新被赋值了 p存放应该就是刷新之前的位置 235 this.setLocation(tem_point); 236 if (tem_point.x 0 | tem_point.y 0) 237 this.setLocation(0, 0); 238 jp.repaint(); 239 try 240 Thread.sleep(5); 241 catch (InterruptedException e) 242 / TODO Auto-generated catch block 243 e.printStackTrace(); 244 245 246 many_fresh-; 247 24

24、8 249 250 251 252 253 Override 254 public void componentResized(ComponentEvent e) 255 / TODO Auto-generated method stub 256 257 this.repaint(); 258 259 260 Override 261 public void componentMoved(ComponentEvent e) 262 / TODO Auto-generated method stub 263 / this.updateBackground(); 264 this.repaint(

25、); 265 266 267 Override 268 public void componentShown(ComponentEvent e) 269 / TODO Auto-generated method stub 270 System.out.println(是不是在执行这个方法); 271 / refresh(); 272 this.repaint(); 273 274 275 Override 276 public void componentHidden(ComponentEvent e) 277 / TODO Auto-generated method stub 278 279

26、 280 281 Override 282 public void mouseClicked(MouseEvent e) 283 / TODO Auto-generated method stub 284 285 286 287 Override 288 public void mousePressed(MouseEvent e) 289 / TODO Auto-generated method stub 290 291 292 293 Override 294 public void mouseReleased(MouseEvent e) 295 / TODO Auto-generated

27、method stub 296 297 298 299 Override 300 public void mouseEntered(MouseEvent e) 301 / TODO Auto-generated method stub 302 many_fresh = 1;/ 这个是不能改的 303 System.out.println(mouseEntered这个应该执行了吧+many_fresh); 304 305 306 Override 307 public void mouseExited(MouseEvent e) 308 / TODO Auto-generated method

28、stub 309 310 many_fresh = 6;/ 这个时候获得焦点就要多次刷新,6次是试出来的比较好的刷新效果,当然5次或者其他的这个自己设置, 311 / 不要纠结这个数字,可以更改 312 System.out.println(这个应该执行了吧mouseExited+many_fresh); 313 314 315 Java代码 316 package transparentUI; 317 318 import java.awt.Dimension; 319 import java.awt.Graphics; 320 import java.awt.Image; 321 import java.awt.Point; 322 import java.awt.Rectangle; 323 import java.awt.Robot; 324 import java.awt.Toolkit; 325 326 327 import javax.swing.JFrame; 328 import javax.swing.JPanel; 329 330 public class JPaneUI extends JPanel

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2