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

我看到了启用或禁用鼠标滚轮滚动的 JScrollPane.setWheelScrollingEnabled(boolean)方法。但是,有没有办法调整滚动的速度呢?在我看来,它慢得可笑。无论我制作的窗口大小如何,滚动大约是每次点击3个像素。我希望不止如此。

有什么想法吗?

60344 次浏览

A quick search brought up this page: How to increase the JScrollPane scrolling speed for mousewheel users. It turns out that the scrolling increment is a property of the scroll bar itself (JScrollBar.setUnitIncrement) and not the scroll pane.

You can try this :

myJScrollPane.getVerticalScrollBar().setUnitIncrement(16);

You can do this by setting the unit increment for a ScrollBar. See the example.

yourScrollPane.getVerticalScrollBar().setUnitIncrement(16);

One way would be to set the unit increment of the scrollbar to a larger number:

scrollPane.getVerticalScrollBar().setUnitIncrement(20);

If you want to set the mouse wheel scroll amount indepedent of the scrollbar unit amout you can use the Mouse Wheel Controller.

You can also use this.

SwingUtil.setScrollUnitIncrement(yourScrollPane);

My solution to speeding up the scroll:

  1. Add scrollbar's parameter:

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

  2. Implement a wheel listener (on the component inside 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);
    }
    

    The increase of wheelRotation is necessary: otherwise the number of scrolled lines will be limited to the size of the screen.

I was trying to find a better method to read through 32000 lines in my ScrollPane

try this

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

For more precise control, the component being scrolled can implement the Scrollable interface. This allows you to dynamically calculate the scrolling unit size (arrow buttons and arrow keys) and the scrolling block size (mouse wheel).

How to use Scroll Panes