You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Swing中如何检测鼠标滚动停止并调用applyAllAction方法?

检测Java Swing滚轮滚动结束的实现方案

要解决无法检测滚轮滚动结束的问题,你可以借助Swing Timer来实现:每次触发滚轮事件时重置计时器,当连续一段时间没有新的滚轮事件,就判定滚动停止,此时调用applyAllAction()。

核心思路是:滚轮滚动过程中会持续触发mouseWheelMoved事件,我们每次收到事件就推迟结束动作的执行;当滚轮停下,计时器到达设定延迟后,就执行全局操作。

修改后的完整代码

import javax.swing.*;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

class MyPane extends JPanel implements MouseWheelListener {

    private int initialScroll;
    private int finalScroll;
    private Timer scrollEndTimer;
    private boolean isScrolling; // 标记是否处于滚动状态

    public MyPane() {
        initialScroll = 0;
        finalScroll = 0;
        isScrolling = false;
        addMouseWheelListener(this);

        // 初始化滚动结束计时器,延迟150ms(可根据手感调整)
        scrollEndTimer = new Timer(150, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                applyAllAction();
                isScrolling = false; // 重置滚动状态
            }
        });
        scrollEndTimer.setRepeats(false); // 仅触发一次结束动作
    }

    @Override
    public void mouseWheelMoved(MouseWheelEvent e) {
        int scrollAmount = e.getWheelRotation(); // 获取单次滚轮滚动的增量

        if (!isScrolling) {
            // 首次触发滚动,记录初始位置
            initialScroll = finalScroll;
            isScrolling = true;
        }

        // 更新累计滚动位置
        finalScroll += scrollAmount;

        // 重置计时器:停止当前计时,重新启动以推迟结束动作
        scrollEndTimer.stop();
        scrollEndTimer.start();
    }

    private void applyAllAction() {
        // 执行全局操作,示例:计算总滚动量
        int totalScroll = finalScroll - initialScroll;
        System.out.println("滚动结束,总滚动量:" + totalScroll);
        // 替换为你的业务逻辑
    }
}

关键细节说明

  • 延迟时间设置:示例中用150ms作为判断滚动停止的阈值,你可以根据实际使用手感调整——值太小可能误判为滚动结束,值太大则会有明显的延迟感。
  • isScrolling标志:确保initialScroll只在滚动开始时被赋值一次,避免每次滚轮事件都重置初始位置。
  • 计时器的非重复设置:setRepeats(false)保证滚动停止后只执行一次applyAllAction(),不会重复触发。

内容的提问来源于stack exchange,提问作者Jersey591

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 02:52:34