知识大全 打造半透明窗口

Posted

篇首语:志行万里者,不中道而辍足。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 打造半透明窗口相关的知识,希望对你有一定的参考价值。

Swing 破局:打造半透明窗口  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  要生成一个半透明的成形窗口 而又要避免使用本地的编码 唯有灵活地应用screenshot(屏幕快照)   半透明窗口是大众对Swing最为渴求的特性之一 也可以称之为定形窗口 这种窗口有一部分是透明的 可以透过它看到桌面背景和其它的程序 如果不通过JNI(Java Native Interface 本地接口)Java是无法为我们生成一个半透明的窗口的(即使我们可以那样做 还得本地操作平台好支持半透明窗口才行) 然而这些现状无法阻止我们对半透明窗口的渴求 通过一个我最喜欢的手段screenshot 我们可以欺骗性地实现这个目的   仿造这样一个的半透明窗口的过程 主要的通过以下几点: 在窗口显示之前 先获得一个screenshot; 把上一步获取的屏幕快照 作为窗口的背景图 调整位置 以便于我们捕获的screenshot和实际当前的屏幕完美结合 制造出一种半透明的假象   刚刚说到的部分只是小儿科 重头戏在于 如何在移动或变化半透明窗口时 及时地更新screenshot 也就是及时更新半透明窗口的背景   在开始我们的旅行之前 先生成一个类 让它继承 JPanel 我们用这个继承类来捕获屏幕 并把捕获的照片作为背景 类的具体代码如下例 例 - 半透明背景组件public class TransparentBackground extends Jponent     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( (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);  首先 构造方法把一个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 bg);    frame pack( );    frame setSize( );    frame show( );通过这段代码 运行出的效果如下图 - 所示 图 展示中的半透明窗口  这段代码相当简单 却带有两个不足之处 首先 如果移动窗口 panel中的背景无法自动的更新 而paintComponent()只在改变窗口大小时被调用 其次 如果屏幕曾经发生过变化 那么我们制作的窗口将永远无法和和屏幕背景联合成整体   谁也不想时不时地跑去更新screenshot 想想看 要找到隐藏于窗口后的东西 要获得一份新的screenshot 还要时不时的用这些screenshot来更新我们的半透明窗口 这些事情足以让用户无法安心工作 事实上 想要获取窗口之外的屏幕的变化几乎是不太可能的事 但多数变动都是发生在foreground窗口发生焦点变化或被移动之时 如果你接受这的观点(至少我接受这个观点) 那么你可以只监控下面提到的几个事件 并只需在这几个事件被触发时 去更新screenshot public class TransparentBackground extends JComponent        implements ComponentListener WindowFocusListener         Runnable     private JFrame frame;    private Image background;    private long lastupdate = ;    public boolean refreshRequested = true;    public TransparentBackground(JFrame frame)         this frame = frame;        updateBackground( );        frame addComponentListener(this);         frame addWindowFocusListener(this);        new Thread(this) start( );        public void ponentShown(ComponentEvent evt) repaint( );     public void ponentResized(ComponentEvent evt) repaint( );     public void ponentMoved(ComponentEvent evt) repaint( );     public void ponentHidden(ComponentEvent evt)     public void windowGainedFocus(WindowEvent evt) refresh( );         public void windowLostFocus(WindowEvent evt) refresh( );   首先 让我们的半透明窗口即panel实现ComponentListener接口 WindowFocusListener接口和Runnable接口 Listener接口可以帮助我们捕获到窗口的移动 大小变化 和焦点变化 实现Runnable接口可以使得panel生成一个线程去控制定制的repaint()方法   ComponentListener接口带有四个ponent开头的方法 它们都可以很方便地调用repaint()方法 所以窗口的背景也就可以随着窗口的移动 大小的变化而相应地更新 还有两个是焦点处理的 它们只调用refresh() 如下示意 public void refresh( )     if(frame isVisible( ))         repaint( );        refreshRequested = true;        lastupdate = new Date( ) getTime( );    public void run( )     try         while(true)             Thread sleep( );            long now = new Date( ) getTime( );            if(refreshRequested &&                ((now lastupdate) > ))                 if(frame isVisible( ))                     Point location = frame getLocation( );                    frame hide( );                    updateBackground( );                    frame show( );                frame setLocation(location);                    refresh( );                                lastupdate = now;                refreshRequested = false;                                     catch (Exception ex)             p(ex toString( ));            ex printStackTrace( );             

cha138/Article/program/Java/hx/201311/26738

相关参考

知识大全 C#窗口透明

C#窗口透明  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  usingSystem;  usin

知识大全 java 伪半透明 JTrxtArea

java伪半透明JTrxtArea  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  说明:java

家装如何用柔和性的灯饰打造出好的装饰设计效果?

灯饰光线和色彩的柔和,与家庭装饰以舒适为目的是相一致的。人若生存在柔和的环境里,无疑是很惬意和舒适的。柔和性灯饰,与所选购的灯具关系密切。像节能灯、日光灯和经过透明塑料、玻璃及水晶玻璃等透射的光线,就

知识大全 我是女生,合租的一个男室友老是穿个半透明内裤那东西都能看见在客厅

我是女生,合租的一个男室友老是穿个半透明内裤那东西都能看见在客厅貌似对你有企图,对他无感就提醒他。还是半透明的,好骚气的样子~~我是女生15岁,学校办活动让每个班派几名表演,老师发了半透明的舞蹈服(上

鱼类竖鳞病防治措施

竖鳞病又名松球病,病鱼往往腹部向上在池中仰游,捞起仔细观察,病鱼全身或部分鳞片竖起如松球状,体表粗糙,鳞的基部水肿,呈半透明的小囊状,其内部积聚着半透明的渗出液,以致鳞片竖起来,用手稍压鳞片,鳞下的积

鱼类竖鳞病防治措施

竖鳞病又名松球病,病鱼往往腹部向上在池中仰游,捞起仔细观察,病鱼全身或部分鳞片竖起如松球状,体表粗糙,鳞的基部水肿,呈半透明的小囊状,其内部积聚着半透明的渗出液,以致鳞片竖起来,用手稍压鳞片,鳞下的积

晶状体半脱位如何治疗?

晶状体半脱位的情况下,如晶状体透明,且无明显症状和并发症时,可不必手术。所引起的屈光不正,可试用镜片矫正。如半脱位明显,有发生全脱位危险,或所引起的屈光不正不能用镜片矫正时,应考虑手术摘除晶状体。

晶状体半脱位如何治疗?

晶状体半脱位的情况下,如晶状体透明,且无明显症状和并发症时,可不必手术。所引起的屈光不正,可试用镜片矫正。如半脱位明显,有发生全脱位危险,或所引起的屈光不正不能用镜片矫正时,应考虑手术摘除晶状体。

冰长石Adularia

冰长石是一种无色的、透明至半透明的正长石的变种。它通常以完好晶体的形式出现在岩脉里。它们虽属单斜晶系,但却出现斜方的对称。

薄片ThinSection

在矿物学研究中,岩石和矿物切成的薄片,贴在玻璃上,然后磨到非常薄,通常是0.03mm左右。在这种薄片中,大多数矿物透明或半透明,它们的光学性质可在透射光偏光显微镜下研究。薄片还提供研究岩石中矿物之间的