Как увеличить скорость прокрутки в JScrollPane при использовании колесика мыши?


95

Я вижу способ JScrollPane.setWheelScrollingEnabled(boolean)включить или отключить прокрутку колеса мыши. Но есть ли способ отрегулировать скорость прокрутки? На мой взгляд, это до смешного медленно. Независимо от размера окна, прокрутка составляет около трех пикселей за щелчок. Я бы хотел, чтобы это было намного больше.

Любые идеи?


4
Примечание. Для тех, кто ищет эквивалент этого сценария Java Script , см. Ускорение колесика мыши в jScrollPane (jQuery) .
Boann

Ответы:


195

Вы можете попробовать это:

myJScrollPane.getVerticalScrollBar().setUnitIncrement(16);

2
Красивая. Я также заметил, что это влияет на стрелки вверх и вниз на полосе прокрутки, что тоже очень желательно.
Эрик Робертсон

1
@AlizainPrasla - при инициализации этой панели прокрутки.
StKiller

Как бы вы также повлияли на щелчок в области между ползунком прокрутки и стрелками вверх или вниз на полосе прокрутки?
Rune

@Rune - кажется, что полоса прокрутки установлена ​​в положение мыши, игнорируя значение приращения единицы.
StKiller

@ AndreiPodoprîgora Обратите внимание, что изменение этого значения изменяет только скорость прокрутки при прокрутке с помощью колеса мыши (или другого устройства, которое позволяет прокручивать), клавиш со стрелками и стрелок полосы прокрутки. Это значение не влияет на скорость движения панели прокрутки при перетаскивании ручки полосы прокрутки. Это значение очень сложно изменить. Если вы хотите добиться этого, вам следует добавить настраиваемые прослушиватели на полосу прокрутки и изменить ее значения.
Tim Visée

12

Один из способов - установить единичное приращение полосы прокрутки на большее число:

scrollPane.getVerticalScrollBar().setUnitIncrement(20);

10

Если вы хотите установить количество прокрутки колеса мыши независимо от единицы полосы прокрутки, вы можете использовать контроллер колеса мыши .


Какое преимущество дает мне то, что я должен включить дополнительный класс в свой проект вместо написания одной строки кода?
Эрик Робертсон

2
@ErickRobertson, это было сделано только для того, чтобы дать вам дополнительную гибкость. По умолчанию прокрутка в 3 раза превышает значение приращения единицы измерения. Например, с JTable по умолчанию приращение единицы измерения равно высоте строки, и поэтому прокрутка по умолчанию будет составлять 3 строки. Если по какой-то причине вам необходимо прокручивать страницу за раз или 5 строк за раз, вы не можете этого сделать, просто манипулируя значением единицы. Также высота строки по умолчанию может быть разной для каждого LAF. Изменяя количество прокрутки на относительной основе, вы получаете лучшую кроссплатформенную поддержку.
camickr

Значение «3» (единицы для прокрутки) поступает из системной панели управления, которую Java поддерживает, что позволяет изменять ее в масштабе всей системы.
Люк Ашервуд, 05

9

Вы можете сделать это, установив приращение единицы для ScrollBar. См. Пример.

yourScrollPane.getVerticalScrollBar().setUnitIncrement(16);


0

Я пытался найти лучший способ прочитать 32000 строк в моей ScrollPane

попробуй это

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

-1

Мое решение для ускорения прокрутки:

  1. Добавить параметр полосы прокрутки:

    scrollPane.getVerticalScrollBar (). putClientProperty ("JScrollBar.fastWheelScrolling", истина);

  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 сразу после моего исходного сообщения. Голосующие против: удалите свои голоса против, если решение работает для вас сейчас, или оставьте комментарий и объясните, чего все еще не хватает.
rychu
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.