- 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); // 显示窗口
}
}
例程测试效果图: