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

95

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

Любые идеи?

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

Ответы:

195

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

myJScrollPane.getVerticalScrollBar().setUnitIncrement(16);
StKiller
источник
2
Красивая. Я также заметил, что это влияет на стрелки вверх и вниз на полосе прокрутки, что тоже очень желательно.
Эрик Робертсон
1
@AlizainPrasla - при инициализации этой панели прокрутки.
StKiller
Как бы вы также повлияли на щелчок в области между ползунком прокрутки и стрелками вверх или вниз на полосе прокрутки?
Rune
@Rune - кажется, что полоса прокрутки установлена ​​в положение мыши, игнорируя значение приращения единицы.
StKiller
@ AndreiPodoprîgora Обратите внимание, что изменение этого значения изменяет только скорость прокрутки при прокрутке с помощью колеса мыши (или другого устройства, которое позволяет прокручивать), клавиш со стрелками и стрелок полосы прокрутки. Это значение не влияет на скорость движения панели прокрутки при перетаскивании ручки полосы прокрутки. Это значение очень сложно изменить. Если вы хотите добиться этого, вам следует добавить настраиваемые прослушиватели на полосу прокрутки и изменить ее значения.
Tim Visée
12

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

scrollPane.getVerticalScrollBar().setUnitIncrement(20);
Джефф
источник
10

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

Camickr
источник
Какое преимущество дает мне то, что я должен включить дополнительный класс в свой проект вместо написания одной строки кода?
Эрик Робертсон
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);

DrHales
источник
0

Для более точного управления прокручиваемый компонент может реализовать интерфейс Scrollable. Это позволяет динамически рассчитывать размер блока прокрутки (кнопки со стрелками и клавиши со стрелками) и размер блока прокрутки (колесо мыши).

Как использовать области прокрутки

Брэд Мейс
источник
-1

Вы также можете использовать это.

SwingUtil.setScrollUnitIncrement(yourScrollPane);

user2287966
источник
хм ... что такое 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