2011-04-07 19 views
78

Veo el método JScrollPane.setWheelScrollingEnabled(boolean) para activar o desactivar el desplazamiento de la rueda del mouse. Sin embargo, ¿hay alguna manera de ajustar la velocidad del desplazamiento? Es, en mi opinión, ridículamente lento. No importa qué tamaño haga la ventana, el desplazamiento es de aproximadamente tres píxeles por clic. Me gustaría que fuera mucho más que eso.¿Cómo puedo acelerar la velocidad de desplazamiento en un JScrollPane cuando uso la rueda del mouse?

¿Alguna idea?

+4

Nota: Para todos aquellos que buscan el Java * Guión * equivalente de esto, vea [Acelere la rueda del mouse en jScrollPane (jQuery)] (http://stackoverflow.com/questions/17154760/speed-up-mouse-wheel-in-jscrollpane-jquery). – Boann

Respuesta

159

Puede probar esto:

myJScrollPane.getVerticalScrollBar().setUnitIncrement(16); 
+1

Hermoso. También noté que esto afecta las flechas hacia arriba y hacia abajo en la barra de desplazamiento, que también es muy deseada. –

+0

¿dónde pego ese código? –

+1

@AlizainPrasla - al inicializar este panel de desplazamiento. – StKiller

7

Usted puede hacer esto mediante el establecimiento de la unidad para la subasta una barra de desplazamiento. Mira el ejemplo.

yourScrollPane.getVerticalScrollBar().setUnitIncrement(16); 
9

Una forma sería la de establecer el mínimo de la unidad de la barra de desplazamiento a un número mayor:

scrollPane.getVerticalScrollBar().setUnitIncrement(20); 
9

Si desea establecer la rueda del ratón cantidad de desplazamiento parte independiente de la amout unidad de barra de desplazamiento se puede utilizar el Mouse Wheel Controller.

+1

Un voto a la baja sin un comentario no significa nada. Nadie aprende nada – camickr

+0

¿Qué ventaja tiene esta oferta que debería incluir una clase extra en mi proyecto en lugar de escribir una línea de código? –

+2

@ErickRobertson, se intentó darle más flexibilidad. 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 se establece por defecto en la altura de la fila y, por lo tanto, el desplazamiento predeterminado será de 3 filas. Si por alguna razón tu requerimiento es desplazarte de una página a la vez o 5 filas a la vez, no puedes hacerlo simplemente manipulando el valor de la unidad. Además, la altura de fila predeterminada puede ser diferente para cada LAF. Al manipular la cantidad de desplazamiento en una base relativa, tiene mejor soporte de plataforma cruzada. – camickr

-1

También puede usar esto.

SwingUtil.setScrollUnitIncrement(yourScrollPane);

+0

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

+0

¿Qué es SwingUtil? –

-1

Mi solución para acelerar el desplazamiento:

  1. Añadir parámetro de barra de desplazamiento:.

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

  2. Implementar un oyente rueda (en el componente interior 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 otro modo el número de líneas de volutas se limita al tamaño de la pantalla.

+0

He corregido el código para que se eliminen los indicadores MAYÚSCULAS y CTRL para evitar el desplazamiento horizontal. Estoy seguro de que los chicos de jdk han agregado desplazamiento horizontal con la tecla Mayús al jdk justo después de mi publicación original. Downvoters: elimine sus downvotes si la solución está funcionando para usted ahora o publique un comentario y explique lo que aún falta. – rychu

0

yo estaba tratando de encontrar un mejor método para leer a través de 32000 líneas en mi ScrollPane

probar esto

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

Cuestiones relacionadas