实现图片的任意拖动

//实现图片的任意拖动 可运行
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Graphics;
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.awt.image.BufferedImage;
 
import javax.swing.JFrame;
 
public class MainFrame extends JFrame implements MouseListener,MouseMotionListener{
     
    public static void main(String[] args) {
        new MainFrame();
    }
     
    private static final long serialVersionUID = 1L;
     
    private BufferedImage img;        //绘制图片
     
    private boolean isPressImage;        //是否操作图片
     
    private int moveSide;        //拉升的边(0:移动 1:上 2:下 3:左 4:右)
     
    private Point imagePoint;        //图片位置
     
    private int[] imageSize;        //图片大小
     
    private Point pressPoint;        //press图片时的鼠标位置
 
    public MainFrame(){
        setSize(new Dimension(600,400));
        setResizable(false);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         
        initData();
         
        setVisible(true);
         
        this.getContentPane().addMouseListener(this);
        this.getContentPane().addMouseMotionListener(this);
    }
     
    private void initData(){
        img = new MyBufferedImage().getImage();
        imagePoint = new Point(0, 0);            //记录图片位置
        imageSize = new int[]{img.getWidth(),img.getHeight()};        //记录图片大小
    }
 
     
    /**当前是否操作图片**/
    private boolean isContains(Point point){
        Rectangle rectangle = new Rectangle();
        rectangle.x = imagePoint.x;
        rectangle.y = imagePoint.y;
        rectangle.width = imageSize[0];
        rectangle.height = imageSize[1];
        return rectangle.contains(point);
    }
     
    /**得到是否是点击的4个边中的1个(0,1,2,3,4)**/
    private int getPressSide(Point point){
        int side = 0;
        Rectangle rectTop = new Rectangle(imagePoint.x+8,imagePoint.y,imageSize[0]-16,8);
        Rectangle rectBottom = new Rectangle(imagePoint.x+8,imagePoint.y+imageSize[1]-8,imageSize[0]-16,8);
        Rectangle rectLeft = new Rectangle(imagePoint.x,imagePoint.y+8,8,imageSize[1]-16);
        Rectangle rectRight = new Rectangle(imagePoint.x+imageSize[0]-8,imagePoint.y+8,8,imageSize[1]-16);
 
        if(rectTop.contains(point)){
            setCursor(2);
            return 1;        //上
        }else if(rectBottom.contains(point)){
            setCursor(2);
            return 2;        //下
        }else if(rectLeft.contains(point)){
            setCursor(4);
            return 3;         //左
        }else if(rectRight.contains(point)){
            setCursor(4);
            return 4;        //右
        }
        return side;        //中间
    }
    @Override
    public void mouseClicked(MouseEvent e) {
        // TODO Auto-generated method stub
         
    }
 
    @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) {
        /**把图片所占的矩阵用变量表示出来(便于判断是否操作图片)**/
        if(isContains(new Point(e.getPoint().x+4, e.getPoint().y+30))){
             
            moveSide = getPressSide(new Point(e.getPoint().x+4, e.getPoint().y+30));        //记录操作图片的边
             
            isPressImage = true;
            pressPoint = e.getPoint();
        }else{
            isPressImage = false;
        }
    }
     
    @Override
    public void mouseReleased(MouseEvent e) {
        // TODO Auto-generated method stub
        isPressImage = false;
        pressPoint = null;
        setCursor(0);
    }
     
    @Override
    public void mouseDragged(MouseEvent arg0) {
        // TODO Auto-generated method stub
        if(isPressImage){
            Point nowPoint = arg0.getPoint();        //当前鼠标拖拽到的鼠标位置
            int diffX = nowPoint.x - pressPoint.x;
            int diffY = nowPoint.y - pressPoint.y;
            /**移动**/
            if(moveSide == 0){    
                setCursor(1);
                this.imagePoint.x += diffX;
                this.imagePoint.y += diffY;
                pressPoint = nowPoint;
            }
            /**收缩**/
            else{
                //收缩 下和右时
                if(moveSide == 2 || moveSide == 4){
                    if(moveSide == 2)            //拉下(只能拉长拉短)
                        this.imageSize[1] += diffY;
                    else                        //拉右(只能拉宽拉窄)
                        this.imageSize[0] += diffX;
                     
                }
                //收缩 上和左时
                else if(moveSide == 1 || moveSide == 3){
                    if(moveSide == 1){            //拉上边(只能拉长拉短)
                        this.imagePoint.y += diffY;
                        this.imageSize[1] -= diffY;
                    }else{                        //拉左边(只能拉宽拉窄)
                        this.imagePoint.x += diffX;
                        this.imageSize[0] -= diffX;
                    }
                     
                }
                pressPoint = nowPoint;
            }
            repaint();
        }
    }
 
    @Override
    public void mouseMoved(MouseEvent arg0) {
        // TODO Auto-generated method stub
         
    }
     
    public void paint(Graphics g){
        super.paint(g);
        g.drawImage(img, imagePoint.x, imagePoint.y, imageSize[0],imageSize[1], null);
    }
     
    public void update(Graphics g){
        paint(g);
    }
     
    public void repaint(Graphics g){
        paint(g);
    }




 class MyBufferedImage {
     
    private BufferedImage image = new BufferedImage(256, 256, BufferedImage.TYPE_3BYTE_BGR);
     
    public MyBufferedImage(){
        File file = new File("map1.jpg");
        if(!file.exists())
            return;
        try {
            BufferedImage imageRead = ImageIO.read(file);
            Graphics g = image.getGraphics();
            g.drawImage(imageRead, 0, 0, imageRead.getWidth(),imageRead.getHeight(), null);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
     
    public BufferedImage getImage(){
        return this.image;
    }
}






}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值