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

114

我看到了JScrollPane.setWheelScrollingEnabled(boolean)方法,可以开启或禁用鼠标滚轮滚动。不过,有没有方法可以调整滚动速度?在我的观点中,它的速度非常慢。无论我把窗口调整成什么尺寸,每次滚动只移动约三个像素。我希望它比这快得多。

有什么想法吗?


5
注意:如果有人需要查找此内容的JavaScript等效版本,请参见Speed up mouse wheel in jScrollPane (jQuery). - Boann
9个回答

229

你可以尝试这个方法:

myJScrollPane.getVerticalScrollBar().setUnitIncrement(16);

2
很好。我还注意到这会影响滚动条中的上下箭头,这也是非常需要的。 - Erick Robertson
1
@AlizainPrasla - 在初始化此滚动面板时。 - StKiller
你还想让这个功能影响滚动条滑块和上下箭头之间的区域点击吗? - Rune
@Rune - 看起来滚动条设置为鼠标位置,忽略了单位增量值。 - StKiller
@AndreiPodoprîgora 你应该注意,更改此值仅会在使用鼠标滚轮(或其他允许滚动的设备)、箭头键和滚动条箭头进行滚动时改变滚动速度。当拖动滚动条旋钮时,此值不会影响滚动窗格移动的速度。更改此值非常困难。如果您想要实现这一点,应向滚动条添加自定义调整侦听器并更改其值。 - Tim Visée

15

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

scrollPane.getVerticalScrollBar().setUnitIncrement(20);

12

您可以通过设置滚动条的单位增量来实现此功能。请参见示例。

yourScrollPane.getVerticalScrollBar().setUnitIncrement(16);

11
如果您想要将鼠标滚轮滚动量设置为独立于滚动条单位的数量,可以使用 鼠标滚轮控制器

这有什么优势,让我在项目中包含一个额外的类而不是编写一行代码呢? - Erick Robertson
3
@ErickRobertson,这只是为了给您增加灵活性。默认情况下,滚动量是单位增量值的3倍。例如,在JTable中,单位增量默认为行高度,因此默认滚动将是3行。如果由于某种原因您需要一页一页地滚动或每次滚动5行,则可以通过操作单位值来实现。此外,默认行高对于每个LAF可能不同。通过相对基础上操作滚动量,您可以获得更好的跨平台支持。 - camickr
1
值为“3”(滚动单位)来自系统控制面板,Java会尊重它,使您能够在整个系统中修改它。 - Luke Usherwood

2

0

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

如何使用滚动窗格


-2

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

试试这个

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


-3

我加速滚动的解决方案:

  1. 添加滚动条参数:

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

  2. 实现一个鼠标滚轮监听器(在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键进行水平滚动的功能。给我投反对票的人:如果解决方案现在对您有效,请撤销您的反对票,或者发表评论并解释仍然缺少什么。 - rychu

-3

您也可以使用这个。

SwingUtil.setScrollUnitIncrement(yourScrollPane);


1
嗯...SwingUtil是什么?假设该方法设置给定滚动窗格的增量-增量值和哪个滚动条? - kleopatra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接