可以实现无边框移动 .
有两个类 .一个是原来的 另一个是为了处理无边框移动
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)
{
}
}
Swing:打造半透明窗口
最新推荐文章于 2012-08-31 16:59:43 发布