截屏

gukuitian 2009-09-24 01:14:11
头几天在这论坛上看见的一个程序,今天玩了下,看见有点小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);
}
}
...全文
161 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
asus52jr 2011-05-28
  • 打赏
  • 举报
回复
体验不是很好啊!没复制到粘贴板
caijian521999 2010-11-16
  • 打赏
  • 举报
回复
运行 就死机??何故??
gukuitian 2009-11-05
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 chizhaojuan 的回复:]
怎么一运行就死机?
[/Quote]
竟有这种事?晕啊,
chizhaojuan 2009-11-05
  • 打赏
  • 举报
回复
怎么一运行就死机?
swandragon 2009-09-26
  • 打赏
  • 举报
回复
学习
java1109 2009-09-26
  • 打赏
  • 举报
回复
mark
alunfeixue 2009-09-26
  • 打赏
  • 举报
回复
呵呵
sforiz 2009-09-26
  • 打赏
  • 举报
回复
很不错吧,分享
amdgaming 2009-09-24
  • 打赏
  • 举报
回复
呵呵,学习了。
gukuitian 2009-09-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 thc1987 的回复:]
有点眼熟,但又不大像,难道是这个?
http://topic.csdn.net/u/20090804/21/be07e6cb-250c-4e42-9c7b-824897a894a5.html

[/Quote]
是这个没错,
猿敲月下码 2009-09-24
  • 打赏
  • 举报
回复
有点眼熟,但又不大像,难道是这个?
http://topic.csdn.net/u/20090804/21/be07e6cb-250c-4e42-9c7b-824897a894a5.html
shayuelang 2009-09-24
  • 打赏
  • 举报
回复
将就吧。。呵呵

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧