JavaFX图片移动和拉伸

功能实现:选择图片后,可以对图片进行移动和拉伸操作

代码如下:

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.io.IOException;

public class PicTest {

    static class Demo {
        private String picPath = "F:\\迅雷下载\\1.png";
        private int x, y, width, height;
        private Image image;

        public Demo() throws IOException {
            this.image = new ImageIcon(picPath).getImage();
            this.width = 200;
            this.height = 200;
            this.x = 0;
            this.y = 0;
        }

        public int getX() {
            return x;
        }

        public void setX(int x) {
            this.x = x;
        }

        public int getY() {
            return y;
        }

        public void setY(int y) {
            this.y = y;
        }

        public int getWidth() {
            return width;
        }

        public void setWidth(int width) {
            this.width = width;
        }

        public int getHeight() {
            return height;
        }

        public void setHeight(int height) {
            this.height = height;
        }

        public Image getImage() {
            return image;
        }

        public void setImage(Image image) {
            this.image = image;
        }
    }

    static class TestPanle extends JPanel {
        private Demo demo;

        public TestPanle(Demo demo) {
            this.demo = demo;
        }

        @Override
        public void paint(Graphics g) {
            super.paint(g);
            g.drawImage(demo.getImage(), demo.getX(), demo.getY(), demo.getWidth(), demo.getHeight(), null);
        }
    }

    static class TestFrame extends JFrame {
        //窗体拉伸属性
        private final static int RESIZE_WIDTH = 5;// 判定是否为调整窗口状态的范围与边界距离

        private int mouseX;
        private int mouseY;
        int picX;
        int picY;
        int width;
        int height;
        int cursorType;

        public TestFrame() throws IOException {
            this.setTitle("Lin");
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.setSize(800, 800);

            Demo demo = new Demo();
            TestPanle panle = new TestPanle(demo);

            panle.addMouseMotionListener(new MouseMotionListener() {
                //鼠标拖动触发
                @Override
                public void mouseDragged(MouseEvent e) {
                    // 用于判断移动或拉伸
                    if (e.getX() > demo.getX() &&
                            e.getX() < demo.getX() + demo.getWidth() &&
                            e.getY() > demo.getY() &&
                            e.getY() < demo.getY() + demo.getHeight() &&
                            // 如果光标类型没有改变就代表是移动,避免事件冲突
                            cursorType == Cursor.DEFAULT_CURSOR
                    ) {
                        demo.setX(picX + e.getX() - mouseX);
                        demo.setY(picY + e.getY() - mouseY);
//                        System.out.println("============" + demo.getX() + " : " + demo.getY());
                    } else {
                        if (cursorType == Cursor.N_RESIZE_CURSOR) { // 向上拉伸
                            demo.setY(picY + (e.getY() - mouseY));
                            if (e.getY() - mouseY > 0) {
                                demo.setHeight(height - (e.getY() - mouseY));
                            } else {
                                demo.setHeight(height - (e.getY() - mouseY));
                            }
                        } else if (cursorType == Cursor.S_RESIZE_CURSOR) { // 向下拉伸
                            if (e.getY() - mouseY > 0) {
                                demo.setHeight(height + (e.getY() - mouseY));
                            } else {
                                demo.setHeight(height + (e.getY() - mouseY));
                            }
                        } else if (cursorType == Cursor.W_RESIZE_CURSOR) { // 向左拉伸
                            demo.setX(picX + (e.getX() - mouseX));
                            if (e.getX() - mouseX > 0) {
                                demo.setWidth(width - (e.getX() - mouseX));
                            } else {
                                demo.setWidth(width - (e.getX() - mouseX));
                            }
                        } else if (cursorType == Cursor.E_RESIZE_CURSOR) { // 向右拉伸
                            if (e.getX() - mouseX > 0) {
                                demo.setWidth(width + (e.getX() - mouseX));
                            } else {
                                demo.setWidth(width + (e.getX() - mouseX));
                            }
                        } else if (cursorType == Cursor.NW_RESIZE_CURSOR) { // 向左上拉伸
                            if (e.getY() - mouseY > 0 || e.getX() - mouseX > 0) {
                                demo.setY(picY + (e.getY() - mouseY));
                                demo.setHeight(height - (e.getY() - mouseY));
                                demo.setX(picX + (e.getX() - mouseX));
                                demo.setWidth(width - (e.getX() - mouseX));
                            } else if (e.getY() - mouseY < 0 || e.getX() - mouseX < 0) {
                                demo.setY(picY + (e.getY() - mouseY));
                                demo.setHeight(height - (e.getY() - mouseY));
                                demo.setX(picX + (e.getX() - mouseX));
                                demo.setWidth(width - (e.getX() - mouseX));
                            }
                        } else if (cursorType == Cursor.NE_RESIZE_CURSOR) { // 向右上拉伸
                            if (e.getY() - mouseY > 0 || e.getX() - mouseX > 0) {
                                demo.setY(picY + (e.getY() - mouseY));
                                demo.setHeight(height - (e.getY() - mouseY));
                                demo.setWidth(width + (e.getX() - mouseX));
                            } else if (e.getY() - mouseY < 0 || e.getX() - mouseX < 0) {
                                demo.setY(picY + (e.getY() - mouseY));
                                demo.setHeight(height - (e.getY() - mouseY));
                                demo.setWidth(width + (e.getX() - mouseX));
                            }
                        } else if (cursorType == Cursor.SW_RESIZE_CURSOR) { // 向左下拉伸
                            if (e.getY() - mouseY > 0 || e.getX() - mouseX > 0) {
                                demo.setHeight(height + (e.getY() - mouseY));
                                demo.setX(picX + (e.getX() - mouseX));
                                demo.setWidth(width - (e.getX() - mouseX));
                            } else if (e.getY() - mouseY < 0 || e.getX() - mouseX < 0) {
                                demo.setHeight(height + (e.getY() - mouseY));
                                demo.setX(picX + (e.getX() - mouseX));
                                demo.setWidth(width - (e.getX() - mouseX));
                            }
                        } else if (cursorType == Cursor.SE_RESIZE_CURSOR) { // 向右下拉伸
                            if (e.getY() - mouseY > 0 || e.getX() - mouseX > 0) {
                                demo.setHeight(height + (e.getY() - mouseY));
                                demo.setWidth(width + (e.getX() - mouseX));
                            } else if (e.getY() - mouseY < 0 || e.getX() - mouseX < 0) {
                                demo.setHeight(height + (e.getY() - mouseY));
                                demo.setWidth(width + (e.getX() - mouseX));
                            }
                        }
                    }
                }
                // 鼠标移动触发
                @Override
                public void mouseMoved(MouseEvent e) {
                    int mouseX = e.getX();
                    int mouseY = e.getY();
                    // 设置鼠标默认类型
                    cursorType = Cursor.DEFAULT_CURSOR;

                    if (mouseY >= demo.getY() && mouseY <= demo.getY() + RESIZE_WIDTH &&
                            mouseX >= demo.getX() && mouseX <= demo.getX() + RESIZE_WIDTH) { // 光标在左上角
                        cursorType = Cursor.NW_RESIZE_CURSOR;
                    } else if (mouseY >= demo.getY() && mouseY <= demo.getY() + RESIZE_WIDTH &&
                            mouseX <= demo.getX() + width && mouseX >= demo.getX() + width - RESIZE_WIDTH) { // 光标在右上角
                        cursorType = Cursor.NE_RESIZE_CURSOR;
                    } else if (mouseY <= demo.getY() + height && mouseY >= demo.getY() + height - RESIZE_WIDTH &&
                            mouseX >= demo.getX() && mouseX <= demo.getX() + RESIZE_WIDTH) { // 光标在左下角
                        cursorType = Cursor.SW_RESIZE_CURSOR;
                    } else if (mouseY <= demo.getY() + height && mouseY >= demo.getY() + height - RESIZE_WIDTH &&
                            mouseX <= demo.getX() + width && mouseX >= demo.getX() + width - RESIZE_WIDTH) { // 光标在右下角
                        cursorType = Cursor.SE_RESIZE_CURSOR;
                    } else if (mouseY >= demo.getY() && mouseY <= demo.getY() + RESIZE_WIDTH &&
                            mouseX > demo.getX() && mouseX < demo.getX() + width) { // 光标在上边界
                        cursorType = Cursor.N_RESIZE_CURSOR;
                    } else if (mouseY <= demo.getY() + height && mouseY >= demo.getY() + height - RESIZE_WIDTH &&
                            mouseX > demo.getX() && mouseX < demo.getX() + width) { // 光标在下边界
                        cursorType = Cursor.S_RESIZE_CURSOR;
                    } else if (mouseX >= demo.getX() && mouseX <= demo.getX() + RESIZE_WIDTH &&
                            mouseY > demo.getY() && mouseY < demo.getY() + height) { // 光标在左边界
                        cursorType = Cursor.W_RESIZE_CURSOR;
                    } else if (mouseX <= demo.getX() + width && mouseX >= demo.getX() + width - RESIZE_WIDTH &&
                            mouseY > demo.getY() && mouseY < demo.getY() + height) { // 光标在右边界
                        cursorType = Cursor.E_RESIZE_CURSOR;
                    }
                    // 改变光标类型
                    panle.setCursor(Cursor.getPredefinedCursor(cursorType));
                }
            });
            panle.addMouseListener(new MouseListener() {
                // 鼠标点击监听
                @Override
                public void mouseClicked(MouseEvent e) {

                }
                // 鼠标按下监听
                @Override
                public void mousePressed(MouseEvent e) {
                    mouseX = e.getX();
                    mouseY = e.getY();
                    picX = demo.getX();
                    picY = demo.getY();
                    width = demo.getWidth();
                    height = demo.getHeight();
                }
                // 鼠标释放监听
                @Override
                public void mouseReleased(MouseEvent e) {
                    mouseX = e.getX();
                    mouseY = e.getY();
                    picX = demo.getX();
                    picY = demo.getY();
                    width = demo.getWidth();
                    height = demo.getHeight();
                }
                // 鼠标进入监听
                @Override
                public void mouseEntered(MouseEvent e) {

                }
                // 鼠标退出监听
                @Override
                public void mouseExited(MouseEvent e) {

                }
            });

            this.add(panle);
            this.setVisible(true);
            // 利用循环不断绘制画面
            while (true) {
                panle.repaint();
            }
        }
    }

    public static void main(String[] args) throws IOException {
        new TestFrame();
    }

}

运行结果如下:
在这里插入图片描述
在窗口中可以对图片进行移动和拉伸操作,由于拉伸方面判断逻辑比较多,比较繁杂,但整体功能实现还是比较简单。
由于只是总结用的,所以就只是简单的功能实现,直接运行就可以。。。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值