import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;
public class DrawImageH extends JFrame{
DrawImageH_Panel panel;
DrawImageH(){
super("拖拽图片");
setBounds(600, 200, 600, 600);
setDefaultCloseOperation(EXIT_ON_CLOSE);
panel = new DrawImageH_Panel();
add(panel);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
SwingUtilities.invokeLater(() ->{
new DrawImageH().setVisible(true);
});
}
private class DrawImageH_Panel extends JPanel {
Image image = new ImageIcon("src\\bg.JPG").getImage();//这里替换需要的图片
int x=10,y=10,width=image.getWidth(this),height=image.getHeight(this);
//右下角缩放区域
int area =60;
Point 鼠标初始xy;
Point 图片初始xy;
//图片是否在拖拽当中
boolean is移动ing = false;
//图片是否在缩放当中
boolean is缩放ing = false;
DrawImageH_Panel(){
MouseAdapter adapter = new MouseAdapter() {
//释放按钮
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
super.mouseReleased(e);
is移动ing = false;
is缩放ing = false;
}
//按下鼠标
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
super.mousePressed(e);
Point p =e.getPoint();
if(is移动area(p)) {
is移动ing = true;
is缩放ing = false;
鼠标初始xy =e.getPoint();
图片初始xy = new Point(x, y);
}else if(is缩放area( p)) {
is移动ing = false;
is缩放ing = true;
}
}
//鼠标按住按键后移动
@Override
public void mouseDragged(MouseEvent e) {
// TODO Auto-generated method stub
super.mouseDragged(e);
Point p = e.getPoint();
if(is移动ing) {
int dx = p.x-鼠标初始xy.x;
int dy = p.y-鼠标初始xy.y;
x = 图片初始xy.x+dx;
y = 图片初始xy.y+dy;
}else if(is缩放ing) {
width = Math.max(20, p.x-x);
height =Math.max(20,p.y-y);
}
repaint();
}
};
addMouseListener(adapter);
addMouseMotionListener(adapter);
}
@Override
protected void paintComponent(Graphics g) {
// TODO Auto-generated method stub
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
g2.drawImage(image, x, y, width, height, this);
}
//判断鼠标是否处于图片移动的区域
public boolean is移动area(Point p) {
if(p == null) {
return false;
}
return p.x>=x && p.x<=x+width-area && p.y>=y && p.y<=x+height-area;
}
//判断鼠标是否处于图片右下角缩放区域
public boolean is缩放area(Point p) {
if(p == null) {
return false;
}
return p.x>=x+width-area && p.x<=x+width &&p.y>=y+height-area && y<=y+height;
}
}
}
这个 Java 程序实现了一个可以拖拽和缩放图片的功能,下面我将从整体功能、关键知识点和代码实现三个方面进行详细解释。
一、整体功能概述
这个程序创建了一个图形界面应用,主要功能包括:
- 显示图片:在窗口中显示指定路径的图片(src\bg.JPG)
- 拖拽图片:点击图片主体区域并拖动鼠标,可以移动图片位置
- 缩放图片:点击图片右下角的特定区域并拖动鼠标,可以调整图片大小
- 状态管理:通过两个布尔变量分别跟踪拖拽和缩放状态
二、关键知识点解析
1. Swing 图形界面编程
- JFrame:主窗口容器,程序的顶级界面
- JPanel:面板组件,用于绘制和组织其他 UI 元素
- ImageIcon:用于加载和显示图片资源
2. 鼠标事件处理
- MouseAdapter:鼠标事件适配器,简化事件处理代码
- mousePressed():鼠标按下时触发
- mouseDragged():鼠标拖拽时触发
- mouseReleased():鼠标释放时触发
3. 状态管理机制
使用两个布尔变量分别管理拖拽和缩放状态:
is移动ing:标记图片是否正在被拖拽移动is缩放ing:标记图片是否正在被缩放调整
4. 坐标计算与边界检测
- 拖拽计算:通过鼠标当前位置与初始位置的差值计算图片新位置
- 缩放计算:通过鼠标位置与图片左上角的距离确定新的宽高
- 边界检测:使用
Math.max()确保图片尺寸不小于最小值(20 像素)
5. 双缓冲区绘图
- paintComponent():重写此方法实现自定义绘图
- Graphics2D:提供更高级的绘图功能
5777

被折叠的 条评论
为什么被折叠?



