Jak zwiększyć prędkość przewijania w JScrollPane, używając kółka myszy?


95

Widzę metodę JScrollPane.setWheelScrollingEnabled(boolean)włączania lub wyłączania przewijania kółkiem myszy. Czy jest jednak sposób na dostosowanie szybkości przewijania? Moim zdaniem jest to absurdalnie powolne. Bez względu na rozmiar okna, przewijanie wynosi około trzech pikseli na kliknięcie. Chciałbym, żeby to było coś więcej.

Jakieś pomysły?


4
Uwaga: Dla każdego, kto szuka odpowiednika tego w Java Script , zobacz Przyspieszenie kółka myszy w jScrollPane (jQuery) .
Boann

Odpowiedzi:


195

Możesz spróbować tego:

myJScrollPane.getVerticalScrollBar().setUnitIncrement(16);

2
Piękny. Zauważyłem również, że wpływa to na strzałki w górę iw dół na pasku przewijania, co jest również bardzo pożądane.
Erick Robertson

1
@AlizainPrasla - podczas inicjalizacji tego panelu przewijania.
StKiller

Jak wpłynie to również na kliknięcie w obszarze między polem przewijania a strzałkami w górę lub w dół na pasku przewijania?
Rune

@Rune - wydaje się, że pasek przewijania jest ustawiony w pozycji myszy, ignorując wartość przyrostu jednostki.
StKiller

@ AndreiPodoprîgora Należy pamiętać, że zmiana tej wartości zmienia prędkość przewijania tylko podczas przewijania za pomocą kółka myszy (lub innego urządzenia, które umożliwia przewijanie), klawiszy strzałek i strzałek paska przewijania. Ta wartość nie wpływa na szybkość, z jaką przesuwa się panel przewijania podczas przeciągania pokrętła paska przewijania. Bardzo trudno jest zmienić tę wartość. Jeśli chcesz to osiągnąć, dodaj do paska przewijania niestandardowe odbiorniki dostosowań i zmień ich wartości.
Tim Visée

12

Jednym ze sposobów byłoby ustawienie jednostki przyrostu paska przewijania na większą liczbę:

scrollPane.getVerticalScrollBar().setUnitIncrement(20);

10

Jeśli chcesz ustawić wielkość przewijania kółkiem myszy niezależnie od ilości jednostek paska przewijania, możesz użyć kontrolera kółka myszy .


Jakie zalety ma to, że powinienem uwzględnić dodatkową klasę w moim projekcie zamiast pisać jedną linię kodu?
Erick Robertson

2
@ErickRobertson, po prostu chodziło o zapewnienie dodatkowej elastyczności. Domyślnie przewijanie jest 3 razy większe od wartości przyrostu jednostki. Na przykład w przypadku tabeli JTable przyrost jednostki domyślnie odpowiada wysokości wiersza, a zatem domyślne przewijanie będzie wynosić 3 wiersze. Jeśli z jakiegoś powodu wymagasz przewijania strony na raz lub 5 wierszy na raz, nie możesz tego zrobić, po prostu manipulując wartością jednostki. Również domyślna wysokość wiersza może być różna dla każdego LAF. Manipulując wartością przewijania na podstawie względnej, uzyskujesz lepszą obsługę wielu platform.
camickr

Wartość „3” (liczba jednostek do przewijania) pochodzi z panelu sterowania systemu, który jest przestrzegany przez język Java, umożliwiając modyfikowanie go w całym systemie.
Luke Usherwood,

9

Możesz to zrobić, ustawiając przyrost jednostek dla ScrollBar. Zobacz przykład.

yourScrollPane.getVerticalScrollBar().setUnitIncrement(16);


0

Próbowałem znaleźć lepszą metodę czytania 32000 wierszy w moim ScrollPane

Spróbuj tego

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


0

Aby uzyskać bardziej precyzyjną kontrolę, przewijany komponent może implementować interfejs przewijalny. Pozwala to dynamicznie obliczyć rozmiar jednostki przewijania (przyciski strzałek i klawisze strzałek) oraz rozmiar przewijanego bloku (kółko myszy).

Jak używać paneli przewijania


-1

Możesz również użyć tego.

SwingUtil.setScrollUnitIncrement(yourScrollPane);


hmm ... co to jest SwingUtil? Zakładając, że metoda ustawia przyrost danego elementu scrollPane - do jakiej wartości i dla którego scrollBar?
kleopatra

-1

Moje rozwiązanie przyspieszające przewijanie:

  1. Dodaj parametr paska przewijania:

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

  2. Zaimplementuj detektor koła (w komponencie wewnątrz 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);
    }
    

    Zwiększenie WheelRotation jest konieczne: w przeciwnym razie liczba przewijanych linii będzie ograniczona do rozmiaru ekranu.


Naprawiłem kod, więc flagi SHIFT i CTRL zostały usunięte, aby zapobiec przewijaniu w poziomie. Jestem pewien, że faceci z jdk dodali przewijanie w poziomie za pomocą klawisza Shift do jdk tuż po moim oryginalnym poście. Osoby negatywne: usuń swoje głosy przeciwne, jeśli rozwiązanie działa teraz, lub opublikuj komentarz i wyjaśnij, czego nadal brakuje.
rychu
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.