Java:JScrollPane在按下ctrl键时禁用滚动

Java:JScrollPane在按下ctrl键时禁用滚动,java,swing,mouseevent,jscrollpane,Java,Swing,Mouseevent,Jscrollpane,我想在按住ctrl键的同时,禁用JScrollPane中的鼠标滚轮滚动。 按ctrl键并移动控制盘时,您将放大/缩小并滚动面板,这不是我想要的 以下是工作代码: scroller = new JScrollPane(view); scroller.removeMouseWheelListener(scroller .getMouseWheelListeners()[0]); scroller.addMouseWheelListener(new Mo

我想在按住ctrl键的同时,禁用JScrollPane中的鼠标滚轮滚动。 按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);
            }
        }
    });
scroller=newjscrollpane(视图);
scroller.removeMouseWheelListener(scroller
.getMouseWheelListeners()[0]);
scroller.addMouseWheelListener(新的MouseWheelListener(){
已移动公共无效鼠标滚轮(最终鼠标滚轮事件){
如果(例如isControlDown()){
如果(如getWheelRotation()<0){
//变焦+
}否则{
//变焦-
}
}否则如果(如IsShift Down()){
//水平滚动
可调整的调整=getScroller().getHorizontalScrollBar();
int scroll=e.getUnitsToScroll()*adj.getBlockIncrement();
adj.setValue(adj.getValue()+滚动);
}否则{
//垂直滚动
可调整的调整=getScroller().getVerticalScrollBar();
int scroll=e.getUnitsToScroll()*adj.getBlockIncrement();
adj.setValue(adj.getValue()+滚动);
}
}
});
编辑我的问题并自己解决。 如果您有任何调整,请告诉我

看一看。您将无法使用确切的代码,但您应该能够使用类的概念

该代码用自定义侦听器替换默认的MouseWheelListener。然后,它使用一个不同的参数重新创建事件,并将事件重新修补到默认侦听器


在您的情况下,您不需要创建新事件,您只需要防止任何带有控件修饰符的事件被重新分配到默认侦听器,而是调用您在问题中发布的代码。

为了临时禁用滚动,您可以操纵滚动条的单位增量值,分别重新恢复

只需将按键侦听器添加到“查看端口”面板,并对按下的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);
  }
});

不是很有用,我编辑了我的原始代码,并在没有使用新类的情况下解决了我的问题。@user1076625如果是,请将其作为答案发布,并接受它。将答案附加到问题后不是正确的方法。干杯@user1076625,您的代码做了很多假设。您假设只有一个鼠标滚轮侦听器。您假设从未使用第一个侦听器的任何默认功能。如果这是您的需求,那么很好,但不要说这个建议没有用,因为它演示了一种更好的方法,可以从所有潜在的侦听器中只删除特定的功能。另外,看起来你复制了我的建议来删除侦听器。唯一的区别是您没有将它们重新添加到中。是否有任何方法可以对tableView滚动窗格执行相同的操作?