Swing:打造半透明窗口

可以实现无边框移动 .

有两个类 .一个是原来的 另一个是为了处理无边框移动

package com.leniz;
import java.awt.*;

import javax.swing.*;
import javax.swing.border.BevelBorder;
import javax.swing.event.*;
import java.awt.event.*;
import java.util.*;

public class TransparentBackground extends JComponent
               implements ComponentListener, WindowFocusListener,Runnable {
  
     private JFrame frame;
     private Image background;
     private long lastupdate = 0;
     public boolean refreshRequested = true;
    
     public TransparentBackground(JFrame frame) {
         this.frame = frame;
         updateBackground( );
         frame.addComponentListener(this);
         frame.addWindowFocusListener(this);
         new Thread(this).start( );
     }

     /**
     * @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( );
       }
     }
     /**
     * @todo 通过当前frame的大小和位置在 background背景中截取图
     *       作为当前frame的背景图片
     */
     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);
     }
    

     public void componentShown(ComponentEvent evt) { repaint( ); }
     public void componentResized(ComponentEvent evt) { repaint( ); }
     public void componentMoved(ComponentEvent evt) { repaint( ); }
     public void componentHidden(ComponentEvent evt) { }
     public void windowGainedFocus(WindowEvent evt) { refresh( ); }    
     public void windowLostFocus(WindowEvent evt) { refresh( ); }

     /**
     * @todo   用上面获取的图片更新背景
     *
     */
     public void refresh( ) {
       if(frame.isVisible( )) {
           repaint( );
           refreshRequested = true;
           lastupdate = new Date( ).getTime( );
       }
     }
    
    
     public void run( ) {
       try {
           while(true) {
               Thread.sleep(250);
               long now = new Date( ).getTime( );
               if(refreshRequested &&
                   ((now - lastupdate) > 1000)) {
                   if(frame.isVisible( )) {
                       Point location = frame.getLocation( );
                       frame.setVisible(false );
                       updateBackground( );
                       frame.setVisible(true );
                   frame.setLocation(location);
                       refresh( );
                   }
                   lastupdate = now;
                   refreshRequested = false;
                   }
               }
           } catch (Exception ex) {
             ex.printStackTrace( );
           }
       }
  
     public static void main(String[] args) {
      
       JFrame frame = new JFrame("Transparent Window");
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);      
       frame.setUndecorated(true);
       TransparentBackground bg = new TransparentBackground(frame);
       bg.setLayout(new BorderLayout( ));      
       JPanel panel = new JPanel( ) {
         public void paintComponent(Graphics g) {
             g.setColor(Color.blue);
             Image img = new ImageIcon("mp3.gif").getImage( );
             g.drawImage(img,0,0,null);
         }
       };      
       panel.setOpaque(false);
       bg.add("Center",panel);
      
       //关闭按键
       JButton exit = new JButton("Exit");
       exit.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e)
         {
           System.exit(0);
         }
       });
       frame.getContentPane().add(exit, BorderLayout.SOUTH);
       frame.getContentPane( ).add("Center",bg);
       frame.pack( );
       frame.setSize(130,160);
      
       new EasyMove().install(frame); //无边框移动 处理  
      
       frame.setLocation(400,400);
       frame.setVisible(true);
     }
    

}


package com.leniz;

import java.awt.BorderLayout;
import java.awt.Component;
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.MouseMotionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.border.BevelBorder;

public class EasyMove extends MouseAdapter implements MouseMotionListener {

   private Point offset;
   private Component host;



   public synchronized void install(Component comp)
   {
     uninstall();
     host = comp;
     host.addMouseListener(this);
     host.addMouseMotionListener(this);
   }

   public synchronized void uninstall()
   {
     if (host != null) {
       host.removeMouseListener(this);
       host.removeMouseMotionListener(this);
       host = null;
     }
   }

   public void mousePressed(MouseEvent e)
   {
     if (e.getSource() == host) offset = e.getPoint();
   }

   public void mouseDragged(MouseEvent e)
   {
     if (e.getSource() != host) return;

     final int x = host.getX();
     final int y = host.getY();
     final Point lastAt = e.getPoint();
     host.setLocation(x + lastAt.x - offset.x, y + lastAt.y - offset.y);
   }

   public void mouseMoved(MouseEvent e)
   {
   }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值