MouseAdapter演示例程-鼠标滚轮事件实现图像缩放和移动例程【MouseWheelEvent】【MouseEvent】

  • MouseAdapter适配器类,它实现了鼠标事件的叁个接口。所以这个监听器对象既可作为MouseListener,也可作为MouseMotionListener,甚至还可作为MouseWheelListener。
    在事件处理时,可为同一个事件源注册多个监听器,甚至可以为同一个事件源注册多个监听器,但用的又是同一个监听器对象。
    本例程就是这种情况,用适配器类MouseAdapter演示鼠标滚轮事件的图像缩放和移动例程。详细的源码如下所示:
package swing;
/***
 * @author QiuGen
 * @description 鼠标滚轮事件例程MouseWheelScale
 * 实现功能:鼠标滚轮滚动实现图像缩放,鼠标拖拉移动图像。
 * @date 2024/04/22
 * ***/
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseWheelEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;
public class MouseWheelScale extends JComponent {
	private BufferedImage bufImg = null;
	private double scale = 1.0; //缩放比例,默认为 1.0
    // 鼠标按下时的坐标 以及 更新后的坐标
    private int startX, startY;
    // 当前的位置偏移
    private int offsetX = 0, offsetY = 0;
    
	private MouseAdapter adapter = new MouseAdapter() {	
		@Override
        public void mouseWheelMoved(MouseWheelEvent e) {
            int notches = e.getWheelRotation();
            if (notches < 0) { // 滚轮向上,放大
                scale *= 1.1;
            } else {	// 滚轮向下,缩小
                scale /= 1.1;
            }
            repaint();  // 重新绘制画布
        }
		
		@Override
		public void mousePressed(MouseEvent e) {
            // 记录鼠标按下时的坐标
            startX = e.getX();
            startY = e.getY();
		}; 

		@Override   // 鼠标拖动事件
        public void mouseDragged(MouseEvent e) {
            // 统计本次鼠标移动的相对值
            int dx = e.getX() - startX;
            int dy = e.getY() - startY;

            // 偏移量计算
            offsetX += dx;
            offsetY += dy;

            repaint();

            // 记录当前拖动后的位置
            startX += dx;
            startY += dy;
        }
	};

    public MouseWheelScale( BufferedImage img ) {
    	bufImg = img;
        // 画板大小设置为 800 x 600
        setPreferredSize(new Dimension(800, 600));
        // 为组件设置鼠标监听事件
        addMouseListener(adapter);
        addMouseMotionListener(adapter);
        addMouseWheelListener(adapter);
	}
    
    @Override
    protected void paintComponent(Graphics g) {
        Graphics2D g2D = (Graphics2D)g;
        g2D.scale(scale, scale);   // 缩放图像
        g2D.translate(offsetX, offsetY);  // 移动图像
        g2D.drawImage(bufImg, 0, 0, this); // 绘制图形
    }
    
	public static void main(String[] args) {
    	BufferedImage image = null;
		try {	// 读取图像文件
			image = ImageIO.read(new File("image\\高清风景.jpeg"));
		} catch (IOException e) { e.printStackTrace(); }
		
        JComponent board = new MouseWheelScale(image);
        // 创建 JFrame 窗口
        JFrame frame = new JFrame("鼠标控制缩放画板");
        // 将滚动面板放入框架窗口
        frame.add(new JScrollPane(board));
        frame.pack();
        // 设置窗口关闭行为:关闭窗口并退出应用
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);  // 显示窗口
	}
}

例程测试效果图:
缩略图
原始图像
缩小移动后再放大
移动位置
缩小图

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值