前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Java AWT 图形界面编程】使用鼠标滚轮放大缩小 Canvas 画布 ( 鼠标滚轮事件监听器 MouseWheelListener )

【Java AWT 图形界面编程】使用鼠标滚轮放大缩小 Canvas 画布 ( 鼠标滚轮事件监听器 MouseWheelListener )

作者头像
韩曙亮
发布2023-03-30 08:39:18
2.3K0
发布2023-03-30 08:39:18
举报
文章被收录于专栏:韩曙亮的移动开发专栏

文章目录

一、使用鼠标滚轮放大缩小 Canvas 画布 - 要点分析


1、鼠标滚轮事件

设置一个缩放比例 scale , 默认为 1.0 ;

代码语言:javascript
复制
    private double scale = 1.0;  // 缩放比例,默认为 1.0

设置鼠标滚轮监听 , 在 Canvas 组件中 , 调用 addMouseWheelListener 函数 , 添加 鼠标滚轮监听器 MouseWheelListener ,

实现该监听器中的 void mouseWheelMoved(MouseWheelEvent e) 函数 ,

当鼠标滚轮滑动时 , 通过 MouseWheelEvent 对象 , 获取鼠标滚轮的滑动方向 ,

  • 向上滑动时 , 放大画布 , 画布增加 10% ;
  • 向下滑动时 , 缩小画布 , 画布缩小 10% ;

一旦 scale 缩放比例发生改变 , 立刻 调用 repaint() 函数 重新绘制 Canvas 画布 , 应用该缩放比例 ;

代码语言:javascript
复制
        // 添加鼠标滚轮监听器
        addMouseWheelListener(new MouseWheelListener() {
            @Override
            public void mouseWheelMoved(MouseWheelEvent e) {
                int notches = e.getWheelRotation();
                if (notches < 0) {
                    // 滚轮向上,放大画布
                    scale *= 1.1;
                } else {
                    // 滚轮向下,缩小画布
                    scale /= 1.1;
                }
                repaint();  // 重新绘制画布
            }
        });

2、核心代码示例

核心代码示例 :

代码语言:javascript
复制
public class MyCanvas extends Canvas {
    private double scale = 1.0;  // 缩放比例,默认为 1.0

    public MyCanvas() {
        // 添加鼠标滚轮监听器
        addMouseWheelListener(new MouseWheelListener() {
            @Override
            public void mouseWheelMoved(MouseWheelEvent e) {
                int notches = e.getWheelRotation();
                if (notches < 0) {
                    // 滚轮向上,放大画布
                    scale *= 1.1;
                } else {
                    // 滚轮向下,缩小画布
                    scale /= 1.1;
                }
                repaint();  // 重新绘制画布
            }
        });
    }

    @Override
    public void paint(Graphics g) {
        Graphics2D g2d = (Graphics2D) g;
        g2d.scale(scale, scale);  // 缩放画布
        // 绘制图形
    }
}

二、绘制超大图像 + 鼠标拖动 + 鼠标滚轮缩放示例


【Java AWT 图形界面编程】Canvas 中绘制超大图片 ( 使用鼠标拖动查看全图 | 设置 JFrame 窗口自动关闭 | 获取并绘制图片 | 鼠标拖动计算位移 | 画布偏移 ) 博客中 , 绘制了超大图像 , 可以使用鼠标拖动 ,

这里在上述基础上 , 新增鼠标滚轮缩放示例 ;

1、代码示例

代码示例 :

代码语言:javascript
复制
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;

public class LargeCanvas extends JPanel {

    // 鼠标按下时的坐标 以及 更新后的坐标
    private int startX, startY;

    // 当前的位置偏移
    private int offsetX = 0, offsetY = 0;

    // 缩放比例,默认为 1.0
    private double scale = 1.0;

    public LargeCanvas() {
        // 画布大小设置为 800 x 600
        // 绘制的图片是 2K 大小的图片
        setPreferredSize(new Dimension(800, 600));

        // 添加鼠标滚轮监听器
        addMouseWheelListener(new MouseWheelListener() {
            @Override
            public void mouseWheelMoved(MouseWheelEvent e) {
                int notches = e.getWheelRotation();
                if (notches < 0) {
                    // 滚轮向上,放大画布
                    scale *= 1.1;
                } else {
                    // 滚轮向下,缩小画布
                    scale /= 1.1;
                }
                repaint();  // 重新绘制画布
            }
        });

        // 为组件设置鼠标监听事件
        addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                // 记录鼠标按下时的坐标
                startX = e.getX();
                startY = e.getY();
            }
        });

        // 添加鼠标动作监听
        addMouseMotionListener(new MouseAdapter() {
            // 鼠标拖动事件
            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 void paintComponent(Graphics g) {
        super.paintComponent(g);

        // 画布进行整体偏移
        Graphics2D g2 = (Graphics2D)g;

        // 缩放画布
        g2.scale(scale, scale);

        // 拖动画布
        g2.translate(offsetX, offsetY);

        // 获取图片
        Image image = Toolkit.getDefaultToolkit().getImage("image.jpg");

        // 绘制图形
        g2.drawImage(image, 0, 0, this);
    }

    public static void main(String[] args) {
        // 创建 JFrame 窗口
        JFrame frame = new JFrame("Large Canvas");

        // 设置窗口关闭行为 点击右上角关闭按钮 关闭窗口并退出应用
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // 创建画布
        LargeCanvas canvas = new LargeCanvas();

        // 将画布放入滚动布局
        JScrollPane scrollPane = new JScrollPane(canvas);

        // 将滚动布局放入窗口
        frame.getContentPane().add(scrollPane);

        // 窗口自适应
        frame.pack();

        // 窗口设置可见
        frame.setVisible(true);
    }
}

2、效果展示

程序运行后默认效果 :

在这里插入图片描述
在这里插入图片描述

使用鼠标滚轮缩小画布 :

在这里插入图片描述
在这里插入图片描述

拖动缩小后的画布到中央位置 :

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-03-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、使用鼠标滚轮放大缩小 Canvas 画布 - 要点分析
    • 1、鼠标滚轮事件
      • 2、核心代码示例
      • 二、绘制超大图像 + 鼠标拖动 + 鼠标滚轮缩放示例
        • 1、代码示例
          • 2、效果展示
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档