Como posso acelerar a velocidade de rolagem em um JScrollPane ao usar a roda do mouse?

94

Vejo o método JScrollPane.setWheelScrollingEnabled(boolean)para ativar ou desativar a rolagem da roda do mouse. Existe alguma maneira de ajustar a velocidade da rolagem, no entanto? É, na minha opinião, ridiculamente lento. Não importa o tamanho da janela, a rolagem é de cerca de três pixels por clique. Eu gostaria que fosse muito mais do que isso.

Alguma ideia?

Erick Robertson
fonte
4
Observação: para quem procura o Java Script equivalente a isso, consulte Acelerar a roda do mouse em jScrollPane (jQuery) .
Boann,

Respostas:

191

Você pode tentar isto:

myJScrollPane.getVerticalScrollBar().setUnitIncrement(16);
StKiller
fonte
2
Lindo. Também notei que isso afeta as setas para cima e para baixo na barra de rolagem, o que também é muito desejado.
Erick Robertson,
1
@AlizainPrasla - ao inicializar este painel de rolagem.
StKiller de
Como você também afetaria o clique na área entre a caixa de rolagem e as setas para cima ou para baixo na barra de rolagem?
Rune
@Rune - parece que a barra de rolagem está configurada para a posição do mouse, ignorando o valor de incremento da unidade.
StKiller
@ AndreiPodoprîgora Você deve observar que alterar este valor apenas altera a velocidade de rolagem ao rolar com a roda do mouse (ou um dispositivo diferente que permite a rolagem), as teclas de seta e as setas da barra de rolagem. Este valor não afetará a velocidade com que o painel de rolagem está se movendo ao arrastar o botão da barra de rolagem. É muito difícil alterar esse valor. Se quiser fazer isso, você deve adicionar ouvintes de ajuste personalizado à barra de rolagem e alterar seus valores.
Tim Visée
12

Uma maneira seria definir o incremento da unidade da barra de rolagem para um número maior:

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

Se você deseja definir a quantidade de rolagem da roda do mouse independentemente da unidade da barra de rolagem, você pode usar o Controlador da roda do mouse .

camickr
fonte
Que vantagem isso oferece de eu incluir uma classe extra em meu projeto em vez de escrever uma linha de código?
Erick Robertson
2
@ErickRobertson, a intenção era apenas fornecer mais flexibilidade. O padrão é a rolagem ser 3 vezes o valor do incremento da unidade. Por exemplo, com um JTable, o padrão de incremento da unidade é a altura da linha e a rolagem padrão será, portanto, de 3 linhas. Se por algum motivo sua exigência for rolar uma página por vez ou 5 linhas por vez, você não pode fazer isso apenas manipulando o valor da unidade. Além disso, a altura padrão da linha pode ser diferente para cada LAF. Ao manipular a quantidade de rolagem em uma base relativa, você tem um melhor suporte de plataforma cruzada.
camickr
O valor '3' (unidades a serem roladas) vem do painel de controle do sistema, que o Java honra, permitindo que você o modifique em todo o sistema.
Luke Usherwood
9

Você pode fazer isso definindo o incremento da unidade para um ScrollBar. Veja o exemplo.

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

Eu estava tentando encontrar um método melhor para ler 32.000 linhas em meu ScrollPane

tente isso

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

DrHales
fonte
0

Para um controle mais preciso, o componente que está sendo rolado pode implementar a interface com rolagem. Isso permite que você calcule dinamicamente o tamanho da unidade de rolagem (botões de seta e teclas de seta) e o tamanho do bloco de rolagem (roda do mouse).

Como usar os painéis de rolagem

Brad Mace
fonte
-1

Você também pode usar isso.

SwingUtil.setScrollUnitIncrement(yourScrollPane);

user2287966
fonte
hmm ... o que é SwingUtil? Supondo que o método defina o incremento do scrollPane fornecido - para qual valor e para qual scrollBar?
kleopatra
-1

Minha solução para acelerar a rolagem:

  1. Adicione o parâmetro da barra de rolagem:

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

  2. Implemente um ouvinte de roda (no 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);
    }

    O aumento de wheelRotation é necessário: caso contrário, o número de linhas roladas será limitado ao tamanho da tela.

rychu
fonte
Corrigi o código para que os sinalizadores SHIFT e CTRL sejam removidos para evitar a rolagem horizontal. Tenho certeza que os caras do jdk adicionaram a rolagem horizontal com a tecla shift ao jdk logo após meu post original. Downvoters: remova seus downvotes se a solução estiver funcionando para você agora ou poste um comentário e explique o que ainda está faltando.
rychu