¿Cómo puedo acelerar la velocidad de desplazamiento en un JScrollPane cuando uso la rueda del mouse?

94

Veo el método JScrollPane.setWheelScrollingEnabled(boolean)para habilitar o deshabilitar el desplazamiento de la rueda del mouse. Sin embargo, ¿hay alguna forma de ajustar la velocidad del desplazamiento? En mi opinión, es ridículamente lento. No importa el tamaño de la ventana, el desplazamiento es de unos tres píxeles por clic. Me gustaría que fuera mucho más que eso.

¿Algunas ideas?

Erick Robertson
fuente
4
Nota: Para cualquiera que busque el equivalente en Java Script , consulte Acelerar la rueda del mouse en jScrollPane (jQuery) .
Boann

Respuestas:

191

Puedes probar esto:

myJScrollPane.getVerticalScrollBar().setUnitIncrement(16);
StKiller
fuente
2
Hermoso. También noté que esto afecta las flechas hacia arriba y hacia abajo en la barra de desplazamiento, lo cual también es muy deseado.
Erick Robertson
1
@AlizainPrasla - al inicializar este panel de desplazamiento.
StKiller
¿Cómo haría que esto también afectara al hacer clic en el área entre el cuadro de desplazamiento y las flechas hacia arriba o hacia abajo en la barra de desplazamiento?
Runa
@Rune: parece que la barra de desplazamiento está configurada en la posición del mouse, ignorando el valor de incremento de la unidad.
StKiller
@ AndreiPodoprîgora Debe tener en cuenta que cambiar este valor solo cambia la velocidad de desplazamiento cuando se desplaza con la rueda del mouse (o un dispositivo diferente que permite el desplazamiento), las teclas de flecha y las flechas de la barra de desplazamiento. Este valor no afectará la velocidad con la que se mueve el panel de desplazamiento al arrastrar la perilla de la barra de desplazamiento. Es muy difícil cambiar este valor. Si desea lograr esto, debe agregar oyentes de ajuste personalizados a la barra de desplazamiento y cambiar sus valores.
Tim Visée
12

Una forma sería establecer el incremento unitario de la barra de desplazamiento en un número mayor:

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

Si desea configurar la cantidad de desplazamiento de la rueda del mouse independientemente de la unidad de la barra de desplazamiento, puede usar el controlador de la rueda del mouse .

camickr
fuente
¿Qué ventaja ofrece esto de que debería incluir una clase extra en mi proyecto en lugar de escribir una línea de código?
Erick Robertson
2
@ErickRobertson, solo tenía la intención de brindarle flexibilidad adicional. El valor predeterminado es que el desplazamiento sea 3 veces el valor de incremento de la unidad. Por ejemplo, con una JTable, el incremento de la unidad tiene como valor predeterminado la altura de la fila y, por lo tanto, el desplazamiento predeterminado será de 3 filas. Si por alguna razón su requisito es desplazarse una página a la vez o 5 filas a la vez, no puede hacerlo simplemente manipulando el valor unitario. Además, la altura de fila predeterminada puede ser diferente para cada LAF. Al manipular la cantidad de desplazamiento sobre una base relativa, tiene un mejor soporte multiplataforma.
camickr
El valor '3' (unidades para desplazarse) proviene del panel de control del sistema, que Java respeta, lo que le permite modificarlo en todo el sistema.
Luke Usherwood
9

Puede hacer esto configurando el incremento de unidad para ScrollBar. Vea el ejemplo.

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

Estaba tratando de encontrar un método mejor para leer 32000 líneas en mi ScrollPane

prueba esto

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

DrHales
fuente
0

Para un control más preciso, el componente que se desplaza puede implementar la interfaz Scrollable. Esto le permite calcular dinámicamente el tamaño de la unidad de desplazamiento (botones de flecha y teclas de flecha) y el tamaño del bloque de desplazamiento (rueda del mouse).

Cómo utilizar los paneles de desplazamiento

Brad Mace
fuente
-1

También puedes usar esto.

SwingUtil.setScrollUnitIncrement(yourScrollPane);

usuario2287966
fuente
hmm ... ¿qué es SwingUtil? Suponiendo que el método establece el incremento del scrollPane dado, ¿a qué valor y para qué scrollBar?
kleopatra
-1

Mi solución para acelerar el desplazamiento:

  1. Agregue el parámetro de la barra de desplazamiento:

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

  2. Implemente un oyente de rueda (en el componente dentro de 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);
    }

    El aumento de wheelRotation es necesario: de lo contrario, el número de líneas desplazadas se limitará al tamaño de la pantalla.

rychu
fuente
He arreglado el código para que se eliminen las banderas SHIFT y CTRL para evitar el desplazamiento horizontal. Estoy seguro de que los chicos de jdk han agregado desplazamiento horizontal con la tecla shift al jdk justo después de mi publicación original. Votantes negativos: elimine sus votos negativos si la solución está funcionando para usted ahora o publique un comentario y explique lo que aún falta.
rychu