zoukankan      html  css  js  c++  java
  • j2se图片拖拽练习

    package graphicsDrag;
    
    import java.awt.AlphaComposite;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.Point;
    import java.awt.Rectangle;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.event.MouseMotionListener;
    import java.util.LinkedList;
    import java.util.List;
    
    import javax.swing.ImageIcon;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    /**
     * 图片拖拽练习
     * @author tiger
     *
     *	0,点中图片拖动可移动图片位置
     *	1,拖动鼠标选中区域内图片
     *  2,按住Ctrl键可连续选择图片,并拖动所有已选图片。
     *  3,按下shift键,在拖动同时复制图片。
     */
    
    @SuppressWarnings({ "unchecked", "serial" })
    public class MyPanel extends JPanel implements MouseListener, MouseMotionListener{
    
    	private int width = 600;
    	private int height = 450;
    	
    	/**
    	 * 所有图片集合
    	 */
    	private List list = new LinkedList();
    	/**
    	 * 当前所选图片集合
    	 */
    	private List select_list = new LinkedList();
    	/**
    	 * 当前所选图片的复制品的集合 。。。用于按下Ctrl键时的拖动
    	 */
    	private List copy_list = new LinkedList();
    	
    	public MyPanel()
    	{
    		this.setPreferredSize(new Dimension(width,height));
    		this.setFocusable(true);
    		
            ImageObject object = new ImageObject("g_2_1.png", 100, 200);
            list.add(object);
            object = new ImageObject("g_434.png", 50, 200);
            list.add(object);
            object = new ImageObject("g_461.png", 150, 300);
            list.add(object);
            object = new ImageObject("g_462.png", 400, 100);
            list.add(object);
            
            
            this.setFocusable(true);
            this.addMouseListener(this);
            this.addMouseMotionListener(this);
    	}
    	
    	
    	
    	/**
    	 * 封装了图片的对象
    	 * @author tiger
    	 *
    	 */
    	class ImageObject{
    		Image image ;
    		int x, y;
    		Rectangle rect;
    		boolean isSelect;
    		
    		public ImageObject() {
    		}
    		
    		public ImageObject(String imageName, int x, int y) {
    			ImageIcon icon = new ImageIcon(getClass().getResource("/image/" + imageName));
    	        image = icon.getImage();
    	        this.x = x;
    	        this.y = y;
    	        rect = new Rectangle(x, y, image.getWidth(null), image.getHeight(null));
    		}
    		public void paint(Graphics g) {
    			g.drawImage(image, x, y, null);
    			if(isSelect)
    			{
    				g.setColor(Color.BLACK);
    				g.drawRect(x - 1, y - 1, image.getWidth(null) + 1, image.getHeight(null) + 1);
    			}
    		}
    		
    		public boolean contains (int x, int y) {
    			return rect.contains(x, y);
    		}
    		
    		public boolean contains (Point p) {
    			return rect.contains(p.x, p.y);
    		}
    		
    		public void move(int moveX, int moveY)
    		{
    			this.x += moveX;
    			this.y += moveY;
    			this.rect.x = this.x;
    			this.rect.y = this.y;
    		}
    		
    		public ImageObject clone()
    		{
    			ImageObject object = new ImageObject();
    			object.x = this.x;
    			object.y = this.y;
    			object.image = this.image;
    			object.isSelect = this.isSelect;
    			object.rect = new Rectangle(x, y, image.getWidth(null), image.getHeight(null));
    			return object;
    		}
    	}
    	
    	
    	
    	public void paintComponent(Graphics g)
    	{
    		super.paintComponent(g);
    		Graphics2D g2 = (Graphics2D) g;
    		ImageObject object = null;
    		for (int i = 0; i < list.size(); i++) {
    			object = (ImageObject) list.get(i);
    			object.paint(g2);
    		}
    		
    		//半透明画复制图
    		g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.75f));
    		for (int i = 0; i < copy_list.size(); i++) {
    			object = (ImageObject) copy_list.get(i);
    			object.paint(g2);
    		}
    		
    		//画选择框
    		g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1));
    		if(selectRect != null)
    		{
    			g2.setColor(Color.green);
    			g2.draw(selectRect);
    		}
    		
    		g2.dispose();
    	}
    	
    	
    	
    
    
    	@Override
    	public void mouseClicked(MouseEvent e) {
    	}
    	@Override
    	public void mouseEntered(MouseEvent e) {
    	}
    	@Override
    	public void mouseExited(MouseEvent e) {
    	}
    
    	/**
    	 * 上次点击的点
    	 */
    	private Point prePoint ;
    
    	
    	
    	/**
    	 * ctrl按下后可以连续选择图片
    	 * shift按下后会复制所选择的图片
    	 */
    	@Override
    	public void mousePressed(MouseEvent e) {
    		Point p = e.getPoint();
    		ImageObject object;
    		
    		if (e.isControlDown())
    		{
    			System.out.println("ctrl is press down !!!");
    		}else{
    			for (int i = 0; i < select_list.size(); i++) {
    				object = (ImageObject) select_list.get(i);
    				object.isSelect = false;
    			}
    			select_list.clear();
    		}
    		
    		for (int i = 0; i < list.size(); i++) {
    			object = (ImageObject) list.get(i);
    			if(object.contains(p) && select_list.contains(object) == false)
    			{
    				select_list.add(object);
    				object.isSelect = true;
    				
    				if(e.isShiftDown())
    				{					
    					copy_list.add(object.clone());
    				}
    				break;
    			}
    		}
    		
    		prePoint = p;
    		this.repaint();
    	}
    
    	private Rectangle selectRect;
    
    	@Override
    	public void mouseDragged(MouseEvent e) {
    		Point p = e.getPoint();
    		
    		if(select_list.isEmpty())
    		{
    			selectRect = new Rectangle(Math.min(p.x, prePoint.x), Math.min(p.y, prePoint.y), 
    					Math.abs(p.x - prePoint.x), Math.abs(p.y - prePoint.y));
    			this.repaint();
    			return;
    		}
    		
    		//针对用选择框选择的图片,shift按下时copy_list还为空的情况
    		if(e.isShiftDown() && copy_list.isEmpty())
    		{
    			for (int i = 0; i < select_list.size(); i++) {
    				copy_list.add(((ImageObject) select_list.get(i)).clone());
    			}
    		}
    		
    		
    		int moveX = p.x - prePoint.x;
    		int moveY = p.y - prePoint.y;
    		ImageObject object;
    		
    		List list ;
    		if(e.isShiftDown())
    		{
    			list = copy_list;
    		}else{
    			list = select_list;
    		}
    		
    		for (int i = 0; i < list.size(); i++) {
    			object = (ImageObject) list.get(i);
    			object.move(moveX, moveY);
    		}
    		prePoint = p;
    		this.repaint();
    	}
    
    	
    
    	@Override
    	public void mouseReleased(MouseEvent e) {
    		prePoint = null;
    		
    		if(selectRect != null)
    		{
    			ImageObject object;
    			for (int i = 0; i < list.size(); i++) {
    				object = (ImageObject) list.get(i);
    				if(object.rect.intersects(selectRect))
    				{
    					select_list.add(object);
    					object.isSelect = true;
    				}
    			}
    			selectRect = null;
    			this.repaint();
    			return;
    		}
    		
    		
    		if(e.isShiftDown() || e.isControlDown())
    		{
    			return;
    		}
    		
    		ImageObject object;
    		for (int i = 0; i < copy_list.size(); i++) {
    			object = (ImageObject) copy_list.get(i);
    			object.isSelect = false;
    			list.add(object);
    		}
    		copy_list.clear();
    		this.repaint();
    	}
    
    	@Override
    	public void mouseMoved(MouseEvent e) {
    	}
    	
    	
    	
    	public static void main(String[] args) {
    		JFrame frame = new JFrame("图片拖动测试");
    		JPanel panel = new MyPanel();
    		frame.getContentPane().add(panel);
    		frame.pack();
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
    	}
    	
    }
    
  • 相关阅读:
    Log4Net使用
    4月博文
    论坛题目练习
    职场冷笑话两则
    初识管理的一些心得
    Project中分清楚挣值项
    预留规划项
    小感触
    好事多磨,好事成双
    忧郁
  • 原文地址:https://www.cnblogs.com/chaohi/p/2064116.html
Copyright © 2011-2022 走看看