Java: JScrollPane отключить прокрутку при нажатии Ctrl - PullRequest
6 голосов
/ 02 декабря 2011

Я хочу отключить прокрутку с помощью колесика мыши в моем JScrollPane, пока нажата Ctrl. Когда вы нажимаете Ctrl и перемещаете колесо, вы увеличиваете и уменьшаете масштаб, а также прокручиваете панель, а это не то, что я хотел.

Вот рабочий код:

    scroller = new JScrollPane(view);
    scroller.removeMouseWheelListener(scroller
            .getMouseWheelListeners()[0]);
    scroller.addMouseWheelListener(new MouseWheelListener() {
        public void mouseWheelMoved(final MouseWheelEvent e) {
            if (e.isControlDown()) {
                if (e.getWheelRotation() < 0) {
                    // Zoom +
                } else {
                    // Zoom -
                }
            } else if (e.isShiftDown()) {
                // Horizontal scrolling
                Adjustable adj = getScroller().getHorizontalScrollBar();
                int scroll = e.getUnitsToScroll() * adj.getBlockIncrement();
                adj.setValue(adj.getValue() + scroll);
            } else {
                // Vertical scrolling
                Adjustable adj = getScroller().getVerticalScrollBar();
                int scroll = e.getUnitsToScroll() * adj.getBlockIncrement();
                adj.setValue(adj.getValue() + scroll);
            }
        }
    });

Отредактировал мой вопрос и решил его сам. Если у вас есть какие-либо хитрости, то скажите мне!

Ответы [ 2 ]

2 голосов
/ 02 декабря 2011

Взгляните на Контроллер колесика мыши . Вы не сможете использовать точный код, но вы должны быть в состоянии использовать концепцию класса.

Код заменяет MouseWheelListener по умолчанию на собственный прослушиватель. Затем он воссоздает событие с одним другим параметром и перенаправляет событие в прослушиватели по умолчанию.

В вашем случае вам не нужно создавать новое событие, вам просто нужно предотвратить повторное отправление любого события с модификатором Control на прослушиватели по умолчанию, и вместо этого вы вызываете код, который вы опубликовали в своем вопросе.

1 голос
/ 12 мая 2014

Чтобы временно отключить прокрутку, вы можете манипулировать значением приращения единицы полосы прокрутки и, соответственно, восстановить его снова.

Просто добавьте прослушиватель клавиш на панель портов просмотра и реагируйте на нажатие клавиши Ctrl:

editorPane.addKeyListener(new KeyAdapter(){
  @Override
  public void keyPressed(KeyEvent e) {
    if ((e.getModifiersEx() & InputEvent.CTRL_DOWN_MASK) != 0) 
      getVerticalScrollBar().setUnitIncrement(0);
    else 
      getVerticalScrollBar().setUnitIncrement(15);
  }

  @Override
  public void keyReleased(KeyEvent e) {
    if ((e.getModifiersEx() & InputEvent.CTRL_DOWN_MASK) != 0) 
      getVerticalScrollBar().setUnitIncrement(0);
    else 
      getVerticalScrollBar().setUnitIncrement(15);
  }
});
...