Як прискорити швидкість прокрутки в JScrollPane при використанні колеса миші?


94

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

Будь-які ідеї?


4
Примітка. Для тих, хто шукає еквівалент Java Script , див. Розділ Прискорення колеса миші в jScrollPane (jQuery) .
Боанн,

Відповіді:


191

Ви можете спробувати це:

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 рази більше значення одиниці приросту. Наприклад, з таблицею JT значенням приросту одиниці за замовчуванням є висота рядка, а прокрутка за замовчуванням буде 3 рядками. Якщо з якихось причин вашою вимогою є прокрутка сторінки за раз або 5 рядків за раз, ви не можете до цього просто маніпулювати одиничним значенням. Також висота рядка за замовчуванням може бути різною для кожного LAF. Маніпулюючи сумою прокрутки на відносній основі, ви отримуєте кращу підтримку на різних платформах.
camickr

Значення '3' (одиниці для прокрутки) надходить із системної панелі управління, яку Java відзначає, що дозволяє вам змінювати її загальносистемно.
Luke Usherwood

9

Це можна зробити, встановивши приріст одиниці для смуги прокрутки. Див. Приклад.

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

Для більш точного управління компонент, який прокручується, може реалізувати прокручуваний інтерфейс. Це дозволяє динамічно обчислювати розмір одиниці прокрутки (кнопки зі стрілками та клавіші зі стрілками) та розмір блоку прокрутки (коліщатко миші).

Як користуватися панелями прокрутки


-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);
    }

    Необхідно збільшити обертання колеса: інакше кількість прокручуваних рядків буде обмежено розміром екрана.


Я виправив код, тому прапорці SHIFT та CTRL видаляються, щоб запобігти горизонтальній прокрутці. Я впевнений, що хлопці jdk додали горизонтальну прокрутку з клавішею shift до jdk відразу після мого оригінального допису. Голоси проти: будь ласка, видаліть свої голоси проти, якщо рішення працює зараз, або залиште коментар та поясніть, чого ще немає.
rychu
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.