我也遇到了这个烦人的问题,Sbodd的解决方案对我来说是不可接受的,因为我需要能够在表和Jtextareas中滚动。我希望其行为与浏览器相同,在可滚动控件上的鼠标将滚动该控件,直到控件触底,然后继续滚动父滚动窗格,通常是整个页面的滚动窗格。
本课程将做到这一点。只需使用它代替常规的JScrollPane。希望对您有帮助。
public class PDControlScrollPane extends JScrollPane {public PDControlScrollPane() { super(); addMouseWheelListener(new PDMouseWheelListener());}class PDMouseWheelListener implements MouseWheelListener { private JScrollBar bar; private int previousValue = 0; private JScrollPane parentScrollPane; private JScrollPane getParentScrollPane() { if (parentScrollPane == null) { Component parent = getParent(); while (!(parent instanceof JScrollPane) && parent != null) { parent = parent.getParent(); } parentScrollPane = (JScrollPane)parent; } return parentScrollPane; } public PDMouseWheelListener() { bar = PDControlScrollPane.this.getVerticalScrollBar(); } public void mouseWheelMoved(MouseWheelEvent e) { JScrollPane parent = getParentScrollPane(); if (parent != null) { if (e.getWheelRotation() < 0) { if (bar.getValue() == 0 && previousValue == 0) { parent.dispatchEvent(cloneEvent(e)); } } else { if (bar.getValue() == getMax() && previousValue == getMax()) { parent.dispatchEvent(cloneEvent(e)); } } previousValue = bar.getValue(); } else { PDControlScrollPane.this.removeMouseWheelListener(this); } } private int getMax() { return bar.getMaximum() - bar.getVisibleAmount(); } private MouseWheelEvent cloneEvent(MouseWheelEvent e) { return new MouseWheelEvent(getParentScrollPane(), e.getID(), e .getWhen(), e.getModifiers(), 1, 1, e .getClickCount(), false, e.getScrollType(), e .getScrollAmount(), e.getWheelRotation()); }}}


