头几天在这论坛上看见的一个程序,今天玩了下,看见有点小BUG,改了下,拿出来给原作者点评
import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.swing.*;@SuppressWarnings("serial")
public class GetScreen extends Frame
{
private static PanelImage panelImage;
private static Graphics g;
//记录屏幕.size()
private static Dimension screenDims;
//用于设置全屏
private GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
//矩形的平面坐标和宽高,
private static int x,y,w,h; public static void main(String args[])
{
GetScreen getScreen=new GetScreen();
//关闭窗口时退出程序
getScreen.addWindowListener(new WindowAdapter() 
{
public void windowClosing(WindowEvent e) 
{
System.exit(0);
}
});
}
public GetScreen()
{
add(getPanelImage());
// 去掉窗口的边框
this.setUndecorated(true);
// 设置全屏
gd.setFullScreenWindow(this);
// 窗体始终靠前
this.setAlwaysOnTop(true);
setVisible(true);
} public JComponent getPanelImage()
{
panelImage=new PanelImage(getScreenImage());
//设置监听
panelImage.addMouseListener(new MouseAdapter()
{
//鼠标抬起:截取图片->存入剪切板->退出程序
public void mouseReleased(MouseEvent e)
{
  setClipboardImage(panelImage.getImg(x, y, w, h));
  JOptionPane.showMessageDialog(null,"已经复制到剪切板");
  System.exit(0);
}
//mouse按下:记录矩阵的起点坐标
public void mousePressed(MouseEvent e)
{
x=e.getX();
y=e.getY();
}
});
panelImage.addMouseMotionListener(new MouseAdapter()
{
//鼠标拖动:重新显示图片->画矩形->记录图片的宽高
public void mouseDragged(MouseEvent e)
{
g=panelImage.getGraphics();
panelImage.paintComponent(g); g.setColor(Color.black);
g.drawLine(x, y, e.getX(), y);
                g.drawLine(x, y, x, e.getY());
                g.drawLine(x, e.getY(), e.getX(), e.getY());
                g.drawLine(e.getX(), y, e.getX(), e.getY());
                g.dispose();                w=e.getX()-x;
h=e.getY()-y;
}
});
return panelImage;
}
/**
 * 获取屏幕画面
 * @return BufferedImage 
 */
private static BufferedImage getScreenImage()
    {
        Robot robot;
        try
        {
            robot = new Robot();
        }
        catch (Exception e)
        {
            throw new RuntimeException("unable to construct Robot");
        }
        // 获取屏幕尺寸
        screenDims = Toolkit.getDefaultToolkit().getScreenSize();
        // 获取屏幕画面
        BufferedImage screen = robot.createScreenCapture(new Rectangle(0, 0,
                screenDims.width, screenDims.height));
        return screen;
    }
/**
 * 把图片存入剪切板
 * @param image 要存入的图片
 */
private static void setClipboardImage(final BufferedImage image)
{
Transferable trans = new Transferable()
{
public DataFlavor[] getTransferDataFlavors()
{
return new DataFlavor[]{ DataFlavor.imageFlavor };
}

public boolean isDataFlavorSupported(DataFlavor flavor)
{
return DataFlavor.imageFlavor.equals(flavor);
}

public Object getTransferData(DataFlavor flavor)
        throws UnsupportedFlavorException, IOException
        {
if (isDataFlavorSupported(flavor))
return image;
throw new UnsupportedFlavorException(flavor);
    }
};
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(trans,null);
}
}
@SuppressWarnings("serial")
class PanelImage extends JPanel
{
private BufferedImage img;
public PanelImage(BufferedImage img)
{
this.img=img;
}
/**
 * 截取子图片;
 * @param x 子图片的 x 坐标;
 * @param y 子图片的 y 坐标;
 * @param w 子图片的宽,为负值时表示鼠标向起点的左边拖动;
 * @param h 子图片的高,为负值时表示鼠标向起点的上方拖动
 * @return BufferedImage
 */
public BufferedImage getImg(int x,int y,int w,int h)
{
//跟据w  h的正负,判断子图的起点与宽高
if(w>0&&h>0)
{
return img.getSubimage(x, y, w, h);
}
else
{
if(w>0&&h<0)
{
return img.getSubimage(x, y+h, w, -h);
}
else
{
if(w<0&&h>0)
{
return img.getSubimage(x+w, y, -w, h);
}
else
{
return img.getSubimage(x+w, y+h, -w, -h);
}
}
}
}
@Override
public void paintComponent(Graphics g)
{
g.drawImage(img,0,0,null);
}
}