java swing 图片移动和缩放

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 程序实现了一个可以拖拽和缩放图片的功能,下面我将从整体功能、关键知识点和代码实现三个方面进行详细解释。

一、整体功能概述

这个程序创建了一个图形界面应用,主要功能包括:

  1. 显示图片:在窗口中显示指定路径的图片(src\bg.JPG)
  2. 拖拽图片:点击图片主体区域并拖动鼠标,可以移动图片位置
  3. 缩放图片:点击图片右下角的特定区域并拖动鼠标,可以调整图片大小
  4. 状态管理:通过两个布尔变量分别跟踪拖拽和缩放状态

二、关键知识点解析

1. Swing 图形界面编程
  • JFrame:主窗口容器,程序的顶级界面
  • JPanel:面板组件,用于绘制和组织其他 UI 元素
  • ImageIcon:用于加载和显示图片资源
2. 鼠标事件处理
  • MouseAdapter:鼠标事件适配器,简化事件处理代码
  • mousePressed():鼠标按下时触发
  • mouseDragged():鼠标拖拽时触发
  • mouseReleased():鼠标释放时触发
3. 状态管理机制

使用两个布尔变量分别管理拖拽和缩放状态:

  • is移动ing:标记图片是否正在被拖拽移动
  • is缩放ing:标记图片是否正在被缩放调整
4. 坐标计算与边界检测
  • 拖拽计算:通过鼠标当前位置与初始位置的差值计算图片新位置
  • 缩放计算:通过鼠标位置与图片左上角的距离确定新的宽高
  • 边界检测:使用Math.max()确保图片尺寸不小于最小值(20 像素)
5. 双缓冲区绘图
  • paintComponent():重写此方法实现自定义绘图
  • Graphics2D:提供更高级的绘图功能

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值