非常简单的截图小工具

用QQ截图太麻烦。
我只是想要截个图,然后图片保持在窗口最前端即可。

2020.5.17

  1. 解决从下往上拉动鼠标造成错误的情况
  2. 增加右击取消截图
import Num.AddNum;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
public class DrawRectTest 
{
	public static void main(String[] args) 
	{
		
		new NewFrame();
	}
}
class NewFrame extends JFrame
{
	private static final long serialVersionUID = 1L;
	/*
	 * 创建一个小的窗口。点击按钮来截屏。
	 */
	JButton button;
	NewFrame()
	{
		setVisible(true);
		setLayout(new FlowLayout());
		setBounds(1000, 600, 200, 100);
		setResizable(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		button = new JButton("截图");
		add(button);
		button.addActionListener(new ActionListener()
				{//鼠标点击按钮,new 一个ScreenFrame,设置可见,
					public void actionPerformed(ActionEvent e) 
					{
						ScreenFrame sf = new ScreenFrame();
						//sf.setAlwaysOnTop(true);
						sf.setUndecorated(true);
						sf.setVisible(true);
					}
				});
		button.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(
				KeyStroke.getKeyStroke(KeyEvent.VK_Z,InputEvent.SHIFT_DOWN_MASK,false), "shift_z");
		button.getActionMap().put("shift_z", new AbstractAction() {
			/**
			 * 
			 */
			private static final long serialVersionUID = 1L;

			public void actionPerformed(ActionEvent e) {
				ScreenFrame sf = new ScreenFrame();
				sf.setUndecorated(true);
				sf.setVisible(true);
			}
		});
	}
}
class ScreenFrame extends JFrame
{
	private static final long serialVersionUID = 2L;
	/*
	 * 创建一个全屏的窗口,将全屏的图像放在JFrame的窗口上,以供来截屏。
	 */
	Dimension di = Toolkit.getDefaultToolkit().getScreenSize();
	ScreenFrame()
	{

		//设置大小,即全屏
		setSize(di);
		setTitle("截图");
		//返回此窗体的 contentPane对象 
		getContentPane().add(new DrawRect());
	}
 
	class DrawRect extends JPanel implements MouseMotionListener, MouseListener
	{
		private static final long serialVersionUID = 3L;
		/*
		 * 将全屏的图像放在JPanel 上, 可以通过new DrawRect来获得JPanel,并且JPanel上有全屏图像
		 */
		int sx, sy, ex=-1, ey=-1;
		int count = 1;
		File file = null;
		BufferedImage image, getImage;
		//截图,新的截图
		boolean flag = true;
		public DrawRect()
		{
			try
			{//获取全屏图像数据,返回给image
				Robot robot = new Robot();
				image = robot.createScreenCapture(new Rectangle(0, 0, di.width, di.height));//获得了全屏的截图
			}
			catch(Exception e)
			{
				throw new RuntimeException("截图失败");
			}
			//添加 鼠标活动事件
			addMouseListener(this);
			addMouseMotionListener(this);
		}
		//重写paintComponent,通过repaint 显示出来截屏的范围
		public void paintComponent(Graphics g)
		{
			g.drawImage(image, 0, 0, di.width, di.height, this);
			g.setColor(Color.blue);
			//System.out.println("鼠标拉动了");
			//if(sx < ex && sy < ey)//右下角
				g.drawRect(sx, sy, ex - sx, ey - sy);
		}
		public void mousePressed(MouseEvent e)
		{
			sx = e.getX();
			sy = e.getY();
		}
		public void mouseReleased(MouseEvent e)	
		{//鼠标单击一下也会执行此代码
			//flag = false;
			if(e.getButton()==MouseEvent.BUTTON3) {
				dispose();
			}
			//else if(e.getButton()==MouseEvent.BUTTON1){} 加上这一句无法截图
			//原因是拉动鼠标的时候,点击的就是鼠标左键
			else {
				if(ex==-1||ey==-1) {return;}
				
				try {
					Robot ro;
					ro = new Robot();
					if(sx < ex && sy < ey) {//右下角
							getImage = ro.createScreenCapture(new Rectangle(sx, sy,	ex - sx, ey - sy));
						ImageIcon icon=new ImageIcon(getImage);
						JLabel label=new JLabel(icon);
						JFrame myframe =new JFrame();
						myframe.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
						myframe.add(label);
						myframe.setBounds(new Rectangle(sx+80, sy+80,ex - sx+80, ey - sy+80));
						myframe.setTitle("Image "+AddNum.Addnum());
						myframe.setVisible(true);
						myframe.setAlwaysOnTop(true);
						int s_width=myframe.getWidth();
						int s_height=myframe.getHeight();
						Dimension s_de=new Dimension(s_width,s_height);
						label.setSize(s_de);
						dispose();
					}
				} catch (AWTException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
			
		}
		public void mouseEntered(MouseEvent e) {}
		public void mouseExited(MouseEvent e)	{}
		//鼠标移动中,通过repaint 画出要截屏的范围
		public void mouseDragged(MouseEvent e) 
		{
			ex = e.getX();
			ey = e.getY();
			repaint();
		}
		public void mouseMoved(MouseEvent e) {}
		@Override
		public void mouseClicked(MouseEvent e) {
			
		}
	}
}
package Num;
public class AddNum{
	 static int num=0;
	public static int Addnum() {
		num++;
		return num;
	}
}

这个完全满足的自己的需要。还用了次exe4j。
缺点就是占内存有点多吧,功能也太少了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值