最后一个问题解决了,例子代码如下(来自
http://forum.java.sun.com)
import java.awt.AWTException;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JFrame;
public class TransparantWindow extends JFrame
{
Graphics tig;
Image img;
Image tim;
Robot r;
public TransparantWindow()
{
super("Fruit");
setUndecorated(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(170, 170, 100, 100);
try
{
r = new Robot();
}
catch (AWTException awe)
{
System.out.println("robot excepton occurred");
}
capture();
WindowDragger dragger = new WindowDragger();
addMouseMotionListener(dragger);
addMouseListener(dragger);
addFocusListener(new FocusAdapter()
{
public void focusGained(FocusEvent e)
{
setSize(0, 0);
capture();
setSize(100, 100);
}
});
setVisible(true);
}
public void capture()
{
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
img = r.createScreenCapture(new Rectangle(0, 0, d.width, d.height));
}
public void captureX()
{
Rectangle rect = getBounds();
setVisible(false);
Image xmg = r.createScreenCapture(rect);
img.getGraphics().drawImage(xmg, rect.x, rect.y, rect.width, rect.height,
null);
setVisible(true);
}
public static void main(String[] args)
{
new TransparantWindow();
}
public void paint(Graphics g)
{
Rectangle rect = g.getClipBounds();
if (tim == null)
{
tim = createImage(getWidth(), getHeight());
tig = tim.getGraphics();
}
if (!rect.getSize().equals(getSize()))
{
captureX();
}
else
{
paintP(g);
}
}
public void paintP(Graphics g)
{
tig.drawImage(img, 0, 0, getWidth(), getHeight(), getX(), getY(),
getX() + getWidth(), getY() + getHeight(), null);
tig.setColor(Color.orange);
tig.fillOval(10, 20, 70, 80);
tig.setColor(Color.green);
tig.fillOval(21, 16, 20, 10);
tig.fillOval(40, 02, 11, 21);
g.drawImage(tim, 0, 0, null);
}
public void update(Graphics g)
{
this.paint(g);
}
private class BackgroundRefresher extends FocusAdapter
{
/**
* @see java.awt.event.FocusAdapter#focusGained(java.awt.event.FocusEvent)
*/
public void focusGained(FocusEvent e)
{
setSize(0, 0);
capture();
setSize(100, 100);
}
}
private class WindowDragger implements MouseListener, MouseMotionListener
{
private Point mp;
/**
* @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent)
*/
public void mouseClicked(MouseEvent e)
{
}
/**
* @see java.awt.event.MouseMotionListener#mouseDragged(java.awt.event.MouseEvent)
*/
public void mouseDragged(MouseEvent e)
{
if (mp == null)
{
return;
}
Point p = e.getPoint();
int x = (getX() + p.x) - mp.x;
int y = (getY() + p.y) - mp.y;
setLocation(x, y);
paintP(getGraphics());
}
/**
* @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent)
*/
public void mouseEntered(MouseEvent e)
{
}
/**
* @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent)
*/
public void mouseExited(MouseEvent e)
{
}
/**
* @see java.awt.event.MouseMotionListener#mouseMoved(java.awt.event.MouseEvent)
*/
public void mouseMoved(MouseEvent e)
{
}
/**
* @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
*/
public void mousePressed(MouseEvent e)
{
mp = e.getPoint();
}
/**
* @see java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent)
*/
public void mouseReleased(MouseEvent e)
{
mp = null;
}
}
}