Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java: JScrollPane disable scrolling when ctrl is pressed

I want to disable scrolling with the mousewheel in my JScrollPane while ctrl is pressed. When you press ctrl and move the wheel you will zoom in/out AND also scroll the panel, which is not what I wanted.

Here's the working code:

    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);
            }
        }
    });

Edited my question and resolved it myself. If you have any tweaks go ahead and tell me!

like image 318
user1076625 Avatar asked Dec 02 '11 02:12

user1076625


2 Answers

Take a look at Mouse Wheel Controller. You won't be able to use the exact code but you should be able to use the concept of the class.

The code replaces the default MouseWheelListener with a custom listener. Then it recreates the event with one different parameter in redispatches the event to the default listeners.

In your case you won't need to create a new event you will just need to prevent any event with a Control modifier from being redispatched to the default listeners and instead you invoke the code you posted in your question.

like image 139
camickr Avatar answered Nov 15 '22 01:11

camickr


In order to temporarily disable scrolling you could manipulate the scrollbar's unit increment value and, respectively, restore it again.

Just add a key listener to the view port panel and react to Ctrl key pressed:

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);
  }
});
like image 42
PAX Avatar answered Nov 15 '22 00:11

PAX