快速业务通道

Swing生成一个半透明的窗口 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16

Swing生成一个半透明的窗口

时间:2011-07-20

要生成一个半透明的成形窗口,而又要避免使用本地的编码,唯有灵活地应用screenshot(屏幕快照).

半透明窗口是大众对Swing最为渴求的特性之一. 也可以称之为定形窗口,这种窗口有一部分是透明的,可以透过它看到桌面背景和其它的程序.如果不通过JNI(Java Native Interface 本地接口)Java是无法为我们生成一个半透明的窗口的(即使我们可以那样做,还得本地操作平台好支持半透明窗口才行).然而这些现状无法阻止我们对半透明窗口的渴求,通过一个我最喜欢的手段screenshot,我们可以欺骗性地实现这个目的.

仿造这样一个的半透明窗口的过程,主要的通过以下几点:

1.在窗口显示之前,先获得一个screenshot;

2.把上一步获取的屏幕快照,作为窗口的背景图

3.调整位置,以便于我们捕获的screenshot和实际当前的屏幕完美结合,制造出一种半透明的假象.

刚刚说到的部分只是小儿科,重头戏在于,如何在移动或变化半透明窗口时,及时地更新screenshot,也就是及时更新半透明窗口的背景.

在开始我们的旅行之前,先生成一个类,让它继承 JPanel,我们用这个继承类来捕获屏幕,并把捕获的照片作为背景. 类的具体代码如下例6-1

例 6-1 。 半透明背景组件

public class TransparentBackground extends Jcomponent {    private JFrame frame;    private Image background; public TransparentBackground(JFrame frame) {    this.frame = frame;    updateBackground( ); } /**   * @todo 获取屏幕快照后立即更新窗口背景   */ public void updateBackground( ) {    try {      Robot rbt = new Robot( );      Toolkit tk = Toolkit.getDefaultToolkit( );      Dimension dim = tk.getScreenSize( );      background = rbt.createScreenCapture(      new Rectangle(0,0,(int)dim.getWidth( ),               (int)dim.getHeight( )));    } catch (Exception ex) {      //p(ex.toString( )); // 此方法没有申明过,因为无法得知上下文。因为不影响执行效果,先注释掉它      ex.printStackTrace( );    } } public void paintComponent(Graphics g) {    Point pos = this.getLocationOnScreen( );    Point offset = new Point(-pos.x,-pos.y);    g.drawImage(background,offset.x,offset.y,null); } }

Swing生成一个半透明的窗口(2)

时间:2011-07-20

首先,构造方法把一个reference保存到父的JFrame,然后调用updateBackground()方法,在这个方法中,我们可以利用java.awt.Robot类捕获到整个屏幕,并把捕获到的图像保存到一个定义了的放置背景的变量中. paintComponent()方法可以帮助我们获得窗口在屏幕上的绝对位置,并用刚刚得到的背景作为panel的背景图,同时这个背景图会因为panel位置的不同而作对应的移动,以使panel的背景和panel覆盖的那部分屏幕图像无缝重叠在一起,同时也就使panel和周围的屏幕关联起来.

我们可以通过下面这个main方法简单的运行一下,随便放置一些组件到panel上,再把panel放置到frame中显示.

public static void main(String[] args) {    JFrame frame = new JFrame("Transparent Window");    TransparentBackground bg = new TransparentBackground(frame);    bg.setLayout(new BorderLayout( ));    JButton button = new JButton("This is a button");    bg.add("North",button);      JLabel label = new JLabel("This is a label");    bg.add("South",label);    frame.getContentPane( ).add("Center

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号