有两个类 .一个是原来的 另一个是为了处理无边框移动 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) { } }