Come posso aumentare la velocità di scorrimento in un JScrollPane quando utilizzo la rotellina del mouse?


94

Vedo il metodo JScrollPane.setWheelScrollingEnabled(boolean)per abilitare o disabilitare lo scorrimento della rotellina del mouse. C'è un modo per regolare la velocità di scorrimento, però? È, a mio parere, ridicolmente lento. Indipendentemente dalle dimensioni della finestra, lo scorrimento è di circa tre pixel per clic. Mi piacerebbe che fosse molto di più.

Qualche idea?


4
Nota: per chiunque cerchi l' equivalente in Java Script di questo, vedere Accelerare la rotellina del mouse in jScrollPane (jQuery) .
Boann

Risposte:


191

Puoi provare questo:

myJScrollPane.getVerticalScrollBar().setUnitIncrement(16);

2
Bellissimo. Ho anche notato che questo influisce sulle frecce su e giù nella barra di scorrimento, che è anche molto desiderato.
Erick Robertson

1
@AlizainPrasla - quando si inizializza questo pannello di scorrimento.
StKiller

In che modo lo faresti influire anche sul clic nell'area tra la casella di scorrimento e le frecce su o giù nella barra di scorrimento?
Runa

@Rune - sembra che la barra di scorrimento sia impostata sulla posizione del mouse, ignorando il valore di incremento dell'unità.
StKiller

@ AndreiPodoprîgora Notare che la modifica di questo valore cambia solo la velocità di scorrimento quando si scorre con la rotellina del mouse (o un dispositivo diverso che consente lo scorrimento), i tasti freccia e le frecce della barra di scorrimento. Questo valore non influirà sulla velocità con cui si muove il riquadro di scorrimento quando si trascina la manopola della barra di scorrimento. È molto difficile modificare questo valore. Se vuoi ottenere questo risultato, devi aggiungere listener di regolazione personalizzati alla barra di scorrimento e modificarne i valori.
Tim Visée

12

Un modo sarebbe impostare l'incremento dell'unità della barra di scorrimento su un numero maggiore:

scrollPane.getVerticalScrollBar().setUnitIncrement(20);

10

Se si desidera impostare la quantità di scorrimento della rotellina del mouse indipendentemente dall'unità della barra di scorrimento, è possibile utilizzare il controller della rotellina del mouse .


Quale vantaggio offre questa possibilità di includere una classe extra nel mio progetto invece di scrivere una riga di codice?
Erick Robertson

2
@ErickRobertson, era solo inteso a darti una maggiore flessibilità. L'impostazione predefinita è che lo scorrimento sia 3 volte il valore di incremento dell'unità. Ad esempio, con una tabella J, l'incremento dell'unità di default è l'altezza della riga e lo scorrimento predefinito sarà quindi di 3 righe. Se per qualche motivo la tua esigenza è di scorrere una pagina alla volta o 5 righe alla volta, non puoi farlo semplicemente manipolando il valore unitario. Inoltre, l'altezza della riga predefinita può essere diversa per ogni LAF. Manipolando la quantità di scorrimento su base relativa si ha un migliore supporto multipiattaforma.
camickr

Il valore "3" (unità di scorrimento) proviene dal pannello di controllo del sistema, che Java rispetta, consentendo di modificarlo a livello di sistema.
Luke Usherwood il

9

Puoi farlo impostando l'incremento di unità per una ScrollBar. Guarda l'esempio.

yourScrollPane.getVerticalScrollBar().setUnitIncrement(16);


0

Stavo cercando di trovare un metodo migliore per leggere 32000 righe nel mio ScrollPane

prova questo

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


0

Per un controllo più preciso, il componente da scorrere può implementare l'interfaccia scorrevole. Ciò consente di calcolare dinamicamente la dimensione dell'unità di scorrimento (pulsanti freccia e tasti freccia) e la dimensione del blocco di scorrimento (rotellina del mouse).

Come utilizzare i riquadri di scorrimento


-1

Puoi anche usare questo.

SwingUtil.setScrollUnitIncrement(yourScrollPane);


hmm ... cos'è SwingUtil? Supponendo che il metodo imposti l'incremento del dato scrollPane - a quale valore e per quale scrollBar?
kleopatra

-1

La mia soluzione per accelerare lo scorrimento:

  1. Aggiungi il parametro della barra di scorrimento:

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

  2. Implementa un listener a ruota (sul componente all'interno di 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);
    }

    L'aumento della Rotazione della rotella è necessario: altrimenti il ​​numero di righe di scorrimento sarà limitato alla dimensione dello schermo.


Ho corretto il codice in modo che i flag SHIFT e CTRL vengano rimossi per impedire lo scorrimento orizzontale. Sono sicuro che i ragazzi di jdk hanno aggiunto lo scorrimento orizzontale con il tasto Maiusc al jdk subito dopo il mio post originale. Downvoters: rimuovi i tuoi downvote se la soluzione funziona per te ora o pubblica un commento e spiega cosa manca ancora.
rychu
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.