使用鼠标滚轮时,如何提高JScrollPane中的滚动速度?


94

我看到了JScrollPane.setWheelScrollingEnabled(boolean)启用或禁用鼠标滚轮滚动的方法。但是,有什么方法可以调整滚动速度?我认为这太慢了。不管我使窗口多大,每次单击滚动约三个像素。我希望它远不止于此。

有任何想法吗?


4
注意:对于正在寻找与此等效的Java Script的任何人,请参见jScrollPane(jQuery)中的“加速鼠标滚轮”
Boann

Answers:


191

您可以尝试以下方法:

myJScrollPane.getVerticalScrollBar().setUnitIncrement(16);

2
美丽。我还注意到这会影响滚动条中的向上和向下箭头,这也是非常需要的。
埃里克·罗伯逊

1
@AlizainPrasla-初始化此滚动面板时。
StKiller

您还会如何影响单击滚动框和滚动条中向上或向下箭头之间的区域?
符文

@Rune-似乎滚动条设置为鼠标位置,忽略了单位增量值。
StKiller

@AndreiPodoprîgora您应注意,更改此值仅在使用鼠标滚轮(或允许滚动的其他设备),箭头键和滚动条箭头滚动时更改滚动速度。左右拖动滚动条旋钮时,此值不会影响滚动窗格移动的速度。更改此值非常困难。如果要实现此目的,应将自定义调整侦听器添加到滚动条并更改其值。
TimVisée2013年

12

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

scrollPane.getVerticalScrollBar().setUnitIncrement(20);

10

如果要设置独立于滚动条单位的鼠标滚轮滚动量,则可以使用鼠标滚轮控制器


这给我带来了什么好处,我应该在项目中包括一个额外的类而不是编写一行代码?
埃里克·罗伯逊

2
@ErickRobertson,它只是为了给您带来更大的灵活性。默认情况下,滚动是单位增量值的3倍。例如,对于JTable,单位增量默认为行高,因此默认滚动为3行。如果由于某种原因您的要求是一次滚动一个页面或一次滚动5行,则只能通过操纵单位值来做到这一点。此外,每个LAF的默认行高可能会有所不同。通过相对地操纵滚动量,您可以获得更好的跨平台支持。
camickr 2012年

值“ 3”(滚动单位)来自Java认可的系统控制面板,使您可以在系统范围内对其进行修改。
路加·乌瑟伍德

9

您可以通过设置ScrollBar的单位增量来实现。参见示例。

yourScrollPane.getVerticalScrollBar().setUnitIncrement(16);


0

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

试试这个

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


0

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

如何使用滚动窗格


-1

您也可以使用它。

SwingUtil.setScrollUnitIncrement(yourScrollPane);


嗯... SwingUtil是什么?假设该方法将给定的scrollPane的增量设置为-哪个值和哪个scrollBar?
kleopatra 2013年

-1

我加快滚动的解决方案:

  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键的水平滚动添加到了jdk中。Downvoters:如果该解决方案现在对您有效,请删除您的downvotes,或者发表评论并解释仍然缺少的内容。
rychu
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.