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?


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

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

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 .


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


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


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


-1

Vous pouvez également l'utiliser.

SwingUtil.setScrollUnitIncrement(yourScrollPane);


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.