Swing做的类似于QQ截图

 

 

import java.awt.AWTException;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;

import javax.swing.*;

public class Screenshot extends JFrame implements MouseMotionListener,MouseListener,KeyListener{
	private BufferedImage buff_img;
	private BufferedImage showImg;
	private BufferedImage sub_buff_img;
	private Rectangle rec;
	private Robot robot; 
	private JLabel label;
	private Point start;
	private Point end;
	private int x,y,width,height;
	private boolean over = false;
	//private JPanel back_panel;
	private Color backGroundCol;
	private JLabel show_sub;
	ImageIcon icon;
	private SubImgAction subAction;
	
	public Screenshot() {
		this.setLayout(null);
		backGroundCol = new Color(200,150,150);
		icon = new ImageIcon();
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.setSize(ScreanSizeUtil.getDimension());
		setUndecorated(true);
		setExtendedState(MAXIMIZED_BOTH);
		
		setResizable(false);//设置不可改变大小
		setAlwaysOnTop(true);//设置总是在顶层(最上层)
		start = new Point();
		end = new Point();
		label = new JLabel();
		show_sub = new JLabel();
		show_sub.setIcon(icon);
		
		add(show_sub);
		try {
			robot = new Robot();
			buff_img = robot.createScreenCapture(new Rectangle(0, 0,
					ScreanSizeUtil.getDimension().width,
					ScreanSizeUtil.getDimension().height));//获得整个屏幕
			
			subAction = new SubImgAction(show_sub,buff_img,icon);
			show_sub.addMouseListener(subAction);
			show_sub.addMouseMotionListener(subAction);
			show_sub.setBorder(BorderFactory.createLineBorder(Color.GREEN,2));
			
			label = new JLabel(){
				  protected   void  paintComponent(Graphics g) {
			             super .paintComponent(g);
			             g.drawImage(buff_img, 0, 0, this);
			     		 Graphics2D g2d  =  (Graphics2D) g;
			             g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
			                     RenderingHints.VALUE_ANTIALIAS_ON);
			             g2d.setColor(backGroundCol);
			             AlphaComposite composite  =  AlphaComposite.getInstance(
			                     AlphaComposite.SRC_OVER,  60   /   100.0F );
			             g2d.setComposite(composite);
			             g2d.fill( new  RoundRectangle2D.Float( 0 ,  0 ,  this .getWidth(),  this 
			                     .getHeight(),  0 ,  0 ));
				  }
			};
			label.setBounds(0, 0, getWidth(), this.getHeight());
			add(label);
		} catch (AWTException e) {
			e.printStackTrace();
		}
		
		setVisible(true);
		try {
			Thread.sleep(500);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		showImg = robot.createScreenCapture(new Rectangle(0, 0,
				ScreanSizeUtil.getDimension().width,
				ScreanSizeUtil.getDimension().height));//获得整个屏幕
		addMouseListener(this);
		addKeyListener(this);
		addMouseMotionListener(this);
	}

	@Override
	public void mouseClicked(MouseEvent e) {
		
	}

	@Override
	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mousePressed(MouseEvent e) {
		start.x = e.getX();
		start.y = e.getY();
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		over = true;
	}

	@Override
	public void mouseDragged(MouseEvent e) {
		if(!over){
			end.x = e.getX();
			end.y = e.getY();
			x = Math.min(start.x, end.x);
			y = Math.min(start.y,end.y);
			width = Math.abs(end.x - start.x);
			height = Math.abs(end.y - start.y);
			if(width == 0 || height == 0)
				return;
			icon.setImage(buff_img.getSubimage(x, y, width, height));
			show_sub.setBounds(x, y, width, height);
			//repaint();
		}
	}

	@Override
	public void mouseMoved(MouseEvent e) {
		end.x = e.getX();
		end.y = e.getY();
		//repaint();
	}
	
	public static void main(String[] args) {
		new Screenshot();
	}


	@Override
	public void keyPressed(KeyEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void keyReleased(KeyEvent e) {
		if(e.getKeyCode() == 27){
			System.exit(0);
		}
	}

	@Override
	public void keyTyped(KeyEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	
}


 

import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

public class SubImgAction implements MouseListener,MouseMotionListener{

	private JLabel label;
	private int x;
	private int y;
	private BufferedImage image;
	private ImageIcon icon;
	
	public SubImgAction(JLabel label,BufferedImage image,ImageIcon icon) {
		this.label = label;
		this.image = image;
		this.icon = icon;
	}
	
	@Override
	public void mouseDragged(MouseEvent e) {
		  Point dragPoint = new Point(e.getPoint());   
	        SwingUtilities.convertPointToScreen(dragPoint, label); 
	        icon.setImage(image.getSubimage(dragPoint.x - x <= 0 ? 0:dragPoint.x - x, 
	        		dragPoint.y - y <= 0?0:dragPoint.y - y, 
	        		label.getWidth(),label.getHeight()));
	        label.setLocation(dragPoint.x - x, dragPoint.y - y);   
	}

	@Override
	public void mouseMoved(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseClicked(MouseEvent e) {
		if(e.getClickCount() == 2){
			new ClipboardUtil().writeToClipboard(image.getSubimage(label.getX(), 
					label.getY(),label.getWidth(),label.getHeight()));
			System.exit(0);
		}
		
	}

	@Override
	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mousePressed(MouseEvent e) {
		 Point clickPoint = new Point(e.getPoint());   
         SwingUtilities.convertPointToScreen(clickPoint, label);  
         x = clickPoint.x - label.getX();   
         y = clickPoint.y - label.getY();   
		
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

}


 

 

import java.awt.Dimension;
import java.awt.Toolkit;

public class ScreanSizeUtil {

	private static Dimension scrSize;
	static{
		if(scrSize == null){
			scrSize = getDimension();
		}
	}
	public static Dimension getDimension(){
		scrSize =Toolkit.getDefaultToolkit().getScreenSize();  
		return scrSize;
	}
	
	public static int getWidth(){
		return (int) scrSize.getWidth();
	}
	
	public static int getHetgth(){
		return (int) scrSize.getHeight();
	}
}


 

 

import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.image.BufferedImage;


public class ClipboardUtil {
	
	private Clipboard  cli;
	/*
	 * 写入系统剪切板
	 */
	public void writeToClipboard(String str){
		if(str != null){
			cli = Toolkit.getDefaultToolkit().getSystemClipboard();
			Transferable text = new StringSelection(str);
			cli.setContents(text, null);
		}
	}
	
	public void writeToClipboard(BufferedImage image){
		cli = Toolkit.getDefaultToolkit().getSystemClipboard();
		cli.setContents(new ImageChange(image),null);
	}
	
	/**
	* 获取系统剪切板中的文本(相当于粘贴)
	* 
	* @return 系统剪切板中的文本
	*/
	public  String getSysClipboardText() {
	   String ret = "";
	   cli = Toolkit.getDefaultToolkit().getSystemClipboard();
	   // 获取剪切板中的内容
	   Transferable clipTf = cli.getContents(null);
	   if (clipTf != null) {
	    // 检查内容是否是文本类型
	    if (clipTf.isDataFlavorSupported(DataFlavor.stringFlavor)) {
	     try {
	      ret = (String) clipTf
	        .getTransferData(DataFlavor.stringFlavor);
	     } catch (Exception e) {
	      e.printStackTrace();
	     }
	    }
	   }
	   return ret;
	}
	
	
	class ImageChange implements Transferable {
		private BufferedImage theImage;
		public ImageChange(BufferedImage image) {
			theImage = image;
		}
		public DataFlavor[] getTransferDataFlavors() {
			return new DataFlavor[] { DataFlavor.imageFlavor };
		}
		public boolean isDataFlavorSupported(DataFlavor flavor) {
			return flavor.equals(DataFlavor.imageFlavor);
		}
		public Object getTransferData(DataFlavor flavor)
		throws UnsupportedFlavorException {
			if (flavor.equals(DataFlavor.imageFlavor)) {
				return theImage;
			} else {
				throw new UnsupportedFlavorException(flavor);
			}
		}
	}
}


 

有些bug不想改了,在超出图像范围会后台报错
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值