功能实现:选择图片后,可以对图片进行移动和拉伸操作
代码如下:
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();
}
}
运行结果如下:
在窗口中可以对图片进行移动和拉伸操作,由于拉伸方面判断逻辑比较多,比较繁杂,但整体功能实现还是比较简单。
由于只是总结用的,所以就只是简单的功能实现,直接运行就可以。。。