Wie beschleunige ich die Bildlaufgeschwindigkeit in einem JScrollPane, wenn ich das Mausrad verwende?

94

Ich sehe die Methode JScrollPane.setWheelScrollingEnabled(boolean)zum Aktivieren oder Deaktivieren des Mausrad-Bildlaufs. Gibt es jedoch eine Möglichkeit, die Geschwindigkeit des Bildlaufs anzupassen? Es ist meiner Meinung nach lächerlich langsam. Unabhängig von der Größe des Fensters beträgt der Bildlauf etwa drei Pixel pro Klick. Ich möchte, dass es viel mehr als das ist.

Irgendwelche Ideen?

Erick Robertson
quelle
4
Hinweis: Informationen zum Java Script- Äquivalent finden Sie unter Beschleunigen des Mausrads in jScrollPane (jQuery) .
Boann

Antworten:

191

Sie können dies versuchen:

myJScrollPane.getVerticalScrollBar().setUnitIncrement(16);
StKiller
quelle
2
Wunderschönen. Mir ist auch aufgefallen, dass dies die Aufwärts- und Abwärtspfeile in der Bildlaufleiste beeinflusst, was ebenfalls sehr erwünscht ist.
Erick Robertson
1
@AlizainPrasla - beim Initialisieren dieses Bildlauffelds.
StKiller
Wie würde sich dies auch auf das Klicken in den Bereich zwischen dem Bildlauffeld und den Aufwärts- oder Abwärtspfeilen in der Bildlaufleiste auswirken?
Rune
@Rune - scheint, dass die Bildlaufleiste auf die Mausposition eingestellt ist, wobei der Einheitsinkrementwert ignoriert wird.
StKiller
@ AndreiPodoprîgora Sie sollten beachten, dass das Ändern dieses Werts nur die Bildlaufgeschwindigkeit ändert, wenn Sie mit einem Mausrad (oder einem anderen Gerät, das das Scrollen ermöglicht), den Pfeiltasten und den Pfeilen der Bildlaufleiste scrollen. Dieser Wert wirkt sich nicht auf die Geschwindigkeit aus, mit der sich der Bildlaufbereich bewegt, wenn Sie den Bildlaufleistenknopf bewegen. Es ist sehr schwer, diesen Wert zu ändern. Wenn Sie dies erreichen möchten, sollten Sie der Bildlaufleiste Listener für benutzerdefinierte Anpassungen hinzufügen und deren Werte ändern.
Tim Visée
12

Eine Möglichkeit wäre, das Einheiteninkrement der Bildlaufleiste auf eine größere Zahl einzustellen:

scrollPane.getVerticalScrollBar().setUnitIncrement(20);
Jeff
quelle
10

Wenn Sie den Mausrad-Bildlauf unabhängig von der Bildlaufleisteneinheit einstellen möchten, können Sie den Mausrad- Controller verwenden .

camickr
quelle
Welchen Vorteil bietet dies, dass ich eine zusätzliche Klasse in mein Projekt aufnehmen sollte, anstatt eine Codezeile zu schreiben?
Erick Robertson
2
@ErickRobertson, es war nur beabsichtigt, Ihnen zusätzliche Flexibilität zu geben. Standardmäßig beträgt der Bildlauf das Dreifache des Einheitsinkrementwerts. Beispielsweise wird bei einer JTable das Einheiteninkrement standardmäßig auf die Zeilenhöhe eingestellt, und das Standard-Scrollen beträgt daher 3 Zeilen. Wenn Sie aus irgendeinem Grund eine Seite oder 5 Zeilen gleichzeitig scrollen müssen, können Sie dies nicht erreichen, indem Sie einfach den Einheitswert manipulieren. Außerdem kann die Standardzeilenhöhe für jedes LAF unterschiedlich sein. Indem Sie den Bildlaufbetrag relativ manipulieren, erhalten Sie eine bessere plattformübergreifende Unterstützung.
Camickr
Der Wert '3' (Einheiten zum Scrollen) stammt aus dem Systembedienfeld, das Java berücksichtigt, sodass Sie es systemweit ändern können.
Luke Usherwood
9

Sie können dies tun, indem Sie das Einheiteninkrement für eine ScrollBar festlegen. Siehe das Beispiel.

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

Ich habe versucht, eine bessere Methode zum Lesen von 32000 Zeilen in meinem ScrollPane zu finden

Versuche dies

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

DrHales
quelle
0

Für eine genauere Steuerung kann die gescrollte Komponente die scrollbare Schnittstelle implementieren. Auf diese Weise können Sie die Größe der Bildlaufeinheit (Pfeiltasten und Pfeiltasten) und die Größe des Bildlaufblocks (Mausrad) dynamisch berechnen.

Verwendung von Bildlauffenstern

Brad Mace
quelle
-1

Sie können dies auch verwenden.

SwingUtil.setScrollUnitIncrement(yourScrollPane);

user2287966
quelle
hmm ... was ist SwingUtil? Angenommen, die Methode setzt das Inkrement des angegebenen scrollPane - auf welchen Wert und für welche scrollBar?
Kleopatra
-1

Meine Lösung, um das Scrollen zu beschleunigen:

  1. Fügen Sie den Parameter der Bildlaufleiste hinzu:

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

  2. Implementieren Sie einen Wheel Listener (für die Komponente in 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);
    }

    Die Erhöhung der WheelRotation ist erforderlich. Andernfalls wird die Anzahl der gescrollten Zeilen auf die Größe des Bildschirms begrenzt.

Rychu
quelle
Ich habe den Code so korrigiert, dass die SHIFT- und STRG-Flags entfernt werden, um ein horizontales Scrollen zu verhindern. Ich bin mir sicher, dass die JDK-Leute dem JDK direkt nach meinem ursprünglichen Beitrag horizontales Scrollen mit Umschalttaste hinzugefügt haben. Downvoters: Bitte entfernen Sie Ihre Downvotes, wenn die Lösung jetzt für Sie funktioniert, oder schreiben Sie einen Kommentar und erklären Sie, was noch fehlt.
Rychu