Comment accélérer la vitesse de défilement dans un JScrollPane lorsque j'utilise la molette de la souris?

94

Je vois la méthode JScrollPane.setWheelScrollingEnabled(boolean)pour activer ou désactiver le défilement de la molette de la souris. Existe-t-il cependant un moyen d'ajuster la vitesse du défilement? C'est, à mon avis, ridiculement lent. Quelle que soit la taille de la fenêtre, le défilement est d'environ trois pixels par clic. J'aimerais que ce soit bien plus que ça.

Des idées?

Erick Robertson
la source
4
Remarque: pour tous ceux qui recherchent l' équivalent Java Script de ceci, voir Accélérer la molette de la souris dans jScrollPane (jQuery) .
Boann

Réponses:

191

Vous pouvez essayer ceci:

myJScrollPane.getVerticalScrollBar().setUnitIncrement(16);
StKiller
la source
2
Belle. J'ai également remarqué que cela affecte les flèches haut et bas dans la barre de défilement, ce qui est également très souhaité.
Erick Robertson le
1
@AlizainPrasla - lors de l'initialisation de ce panneau de défilement.
StKiller
En quoi cela affecterait-il également le fait de cliquer dans la zone entre la zone de défilement et les flèches vers le haut ou vers le bas dans la barre de défilement?
Rune
@Rune - semble que la barre de défilement est réglée sur la position de la souris, ignorant la valeur d'incrément de l'unité.
StKiller
@ AndreiPodoprîgora Notez que la modification de cette valeur ne change que la vitesse de défilement lors du défilement avec une molette de la souris (ou un autre appareil permettant le défilement), les touches fléchées et les flèches de la barre de défilement. Cette valeur n'affectera pas la vitesse de déplacement du volet de défilement lors du déplacement du bouton de la barre de défilement. Il est très difficile de modifier cette valeur. Si vous souhaitez y parvenir, vous devez ajouter des écouteurs d'ajustement personnalisés à la barre de défilement et modifier ses valeurs.
Tim Visée
12

Une façon serait de définir l'incrément d'unité de la barre de défilement sur un nombre plus grand:

scrollPane.getVerticalScrollBar().setUnitIncrement(20);
Jeff
la source
10

Si vous souhaitez régler la quantité de défilement de la molette de la souris indépendamment de la quantité de la barre de défilement, vous pouvez utiliser le contrôleur de la molette de la souris .

camickr
la source
Quel avantage cela offre-t-il que je devrais inclure une classe supplémentaire dans mon projet au lieu d'écrire une ligne de code?
Erick Robertson le
2
@ErickRobertson, c'était juste pour vous donner plus de flexibilité. Par défaut, le défilement correspond à 3 fois la valeur d'incrément de l'unité. Par exemple, avec un JTable, l'incrément d'unité est par défaut la hauteur de la ligne et le défilement par défaut sera donc de 3 lignes. Si pour une raison quelconque votre exigence est de faire défiler une page à la fois ou 5 lignes à la fois, vous ne pouvez pas y parvenir en manipulant simplement la valeur unitaire. De plus, la hauteur de ligne par défaut peut être différente pour chaque LAF. En manipulant la quantité de défilement sur une base relative, vous bénéficiez d'un meilleur support multiplateforme.
camickr
La valeur '3' (unités à faire défiler) provient du panneau de configuration du système, que Java honore, vous permettant de le modifier à l'échelle du système.
Luke Usherwood
9

Vous pouvez le faire en définissant l'incrément d'unité pour une ScrollBar. Voir l'exemple.

yourScrollPane.getVerticalScrollBar().setUnitIncrement(16);
Michael de Jong
la source
0

J'essayais de trouver une meilleure méthode pour lire 32000 lignes dans mon ScrollPane

essaye ça

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

DrHales
la source
0

Pour un contrôle plus précis, le composant en cours de défilement peut implémenter l'interface Scrollable. Cela vous permet de calculer dynamiquement la taille de l'unité de défilement (boutons fléchés et touches fléchées) et la taille du bloc de défilement (molette de la souris).

Comment utiliser les volets de défilement

Brad Mace
la source
-1

Vous pouvez également l'utiliser.

SwingUtil.setScrollUnitIncrement(yourScrollPane);

user2287966
la source
hmm ... qu'est-ce que SwingUtil? En supposant que la méthode définit l'incrément du scrollPane donné - à quelle valeur et pour quelle scrollBar?
kleopatra
-1

Ma solution pour accélérer le scroll:

  1. Ajouter le paramètre de la barre de défilement:

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

  2. Implémentez un écouteur de roue (sur le composant dans 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'augmentation de wheelRotation est nécessaire: sinon le nombre de lignes défilées sera limité à la taille de l'écran.

rychu
la source
J'ai corrigé le code afin que les indicateurs SHIFT et CTRL soient supprimés pour empêcher le défilement horizontal. Je suis sûr que les gars de jdk ont ​​ajouté le défilement horizontal avec la touche Maj au jdk juste après mon message d'origine. Downvoters: veuillez supprimer vos downvotes si la solution fonctionne pour vous maintenant ou postez un commentaire et expliquez ce qui manque encore.
rychu