使用鼠标滚轮时如何加快 JScrollPane 中的滚动速度?

Posted

技术标签:

【中文标题】使用鼠标滚轮时如何加快 JScrollPane 中的滚动速度?【英文标题】:How do I speed up the scroll speed in a JScrollPane when using the mouse wheel? 【发布时间】:2011-07-31 19:23:52 【问题描述】:

我看到了JScrollPane.setWheelScrollingEnabled(boolean) 方法来启用或禁用鼠标滚轮滚动。不过,有什么办法可以调整滚动的速度吗?在我看来,这是非常缓慢的。无论我制作什么尺寸的窗口,每次点击滚动大约三个像素。我希望它不止于此。

有什么想法吗?

【问题讨论】:

注意:对于正在寻找与此等效的 JavaScript 的任何人,请参阅 Speed up mouse wheel in jScrollPane (jQuery)。 【参考方案1】:

为了更精准的控制,被滚动的组件可以实现Scrollable接口。这允许您动态计算滚动单元大小(箭头按钮和箭头键)和滚动块大小(鼠标滚轮)。

How to use Scroll Panes

【讨论】:

【参考方案2】:

我加快滚动速度的解决方案:

    添加滚动条的参数:

    scrollPane.getVerticalScrollBar().putClientProperty("JScrollBar.fastWheelScrolling", true);

    实现一个***监听器(在 jViewport 内的组件上):

    public void mouseWheelMoved(MouseWheelEvent e) 
        boolean isCtrl = (e.getModifiersEx() & MouseWheelEvent.CTRL_DOWN_MASK) != 0;
        boolean isShift = (e.getModifiersEx() & MouseWheelEvent.SHIFT_DOWN_MASK) != 0;
    
        MouseWheelEvent eventToDispatch = e;
        if (isCtrl || isShift) 
            int amountMulti = 1;
            int rotMulti = 1;
            if (isCtrl) 
                amountMulti *= 10;
                if (isShift) 
                    amountMulti *= 5;
                    rotMulti *= 2;
                
            
            int mod = e.getModifiers() & ~InputEvent.CTRL_MASK & ~InputEvent.SHIFT_MASK;
            int modEx = e.getModifiersEx() & ~MouseWheelEvent.CTRL_DOWN_MASK & ~MouseWheelEvent.SHIFT_DOWN_MASK;
            eventToDispatch = new MouseWheelEvent(this, e.getID(), e.getWhen()
             , mod | modEx, e.getX(), e.getY()
             , e.getXOnScreen(), e.getYOnScreen(), e.getClickCount(), e.isPopupTrigger()
             , e.getScrollType(), e.getScrollAmount()*amountMulti, e.getWheelRotation()*rotMulti
             , e.getPreciseWheelRotation()*amountMulti*rotMulti);
        
    
        getParent().dispatchEvent(eventToDispatch);
    
    

    wheelRotation 的增加是必须的:否则滚动的行数将受限于屏幕的大小。

【讨论】:

我已经修复了代码,因此移除了 SHIFT 和 CTRL 标志以防止水平滚动。我确信 jdk 的家伙在我原来的帖子之后已经用 shift 键向 jdk 添加了水平滚动。反对者:如果解决方案现在对您有效,请删除您的反对意见,或者发表评论并解释仍然缺少的内容。【参考方案3】:

我试图找到一种更好的方法来阅读我的 ScrollPane 中的 32000 行

试试这个

scrollPane.getVerticalScrollBar().setUnitIncrement(100); scrollPane.getViewport().putClientProperty("EnableWindowBlit", Boolean.TRUE); scrollPane.getViewport().setScrollMode(JViewport.BACKINGSTORE_SCROLL_MODE);

【讨论】:

【参考方案4】:

您也可以使用它。

SwingUtil.setScrollUnitIncrement(yourScrollPane);

【讨论】:

嗯 ... SwingUtil 是什么?假设该方法将给定 scrollPane 的增量设置为哪个值和哪个滚动条?【参考方案5】:

如果你想设置鼠标滚轮滚动量独立于滚动条单元,你可以使用Mouse Wheel Controller。

【讨论】:

我应该在我的项目中包含一个额外的类而不是编写一行代码,这有什么好处? @ErickRobertson,它只是为了给你增加灵活性。默认滚动为单位增量值的 3 倍。例如,对于 JTable,单位增量默认为行高,因此默认滚动为 3 行。如果出于某种原因,您的要求是一次滚动一页或一次滚动 5 行,您不能仅通过操作单位值来实现。此外,每个 LAF 的默认行高可能不同。通过在相对基础上操纵滚动量,您可以获得更好的跨平台支持。 值 '3'(滚动单位)来自系统控制面板,Java 尊重它,使您能够在系统范围内对其进行修改。【参考方案6】:

你可以试试这个:

myJScrollPane.getVerticalScrollBar().setUnitIncrement(16);

【讨论】:

美丽。我还注意到这会影响滚动条中的向上和向下箭头,这也是非常需要的。 @AlizainPrasla - 初始化此滚动面板时。 您会如何影响单击滚动框和滚动条中向上或向下箭头之间的区域? @Rune - 滚动条似乎设置为鼠标位置,忽略单位增量值。 @AndreiPodoprîgora 您应该注意,更改此值只会更改使用鼠标滚轮(或其他允许滚动的设备)、箭头键和滚动条箭头滚动时的滚动速度。当拖动滚动条旋钮时,此值不会影响滚动窗格的移动速度。很难改变这个值。如果你想实现这一点,你应该向滚动条添加自定义调整监听器并更改它的值。【参考方案7】:

一种方法是将滚动条的单位增量设置为更大的数字:

scrollPane.getVerticalScrollBar().setUnitIncrement(20);

【讨论】:

【参考方案8】:

您可以通过设置滚动条的单位增量来做到这一点。请参阅示例。

yourScrollPane.getVerticalScrollBar().setUnitIncrement(16);

【讨论】:

【参考方案9】:

快速搜索显示此页面:How to increase the JScrollPane scrolling speed for mousewheel users。事实证明,滚动增量是滚动条本身的属性 (JScrollBar.setUnitIncrement) 而不是滚动窗格。

【讨论】:

以上是关于使用鼠标滚轮时如何加快 JScrollPane 中的滚动速度?的主要内容,如果未能解决你的问题,请参考以下文章

RAWINPUT - 如何获取鼠标滚轮数据

WPF:如何在拖动 ListView 项目时允许在 ListView 中使用鼠标滚轮滚动?

vb如何监视鼠标滚轮事件

js中如何禁用鼠标滚轮事件?急,在线等!

如何引导鼠标滚轮输入在光标下控制而不是聚焦?

如何让我的猫头鹰旋转木马方向跟随鼠标滚轮方向