changed: when the mouse wheel event is not in the viewport, propagate the event to the nearest parent

Scenario: A JTabbedPane inside a JScrollPane
Expectation: Moving the mouse wheel inside the TabbedPane's content should cause the outer ScrollPane to scroll
Actual: Event dispatcher targets TabbedPane, but the TabbedPane's mouse listener does nothing because the event is not in the viewport. The only other target is the ancestor (Window), which discards the event.
Fix: If the event does not occur in the viewport, delegate it up in the hierarchy to the nearest parent with a MouseWheelListener
This commit is contained in:
lkrieger-oashi
2025-08-20 10:17:01 +02:00
committed by GitHub
parent e7a766bf8f
commit 8cfe1ca597

View File

@@ -2707,8 +2707,22 @@ debug*/
// because this listener receives mouse events for the whole tabbed pane,
// we have to check whether the mouse is located over the viewport
if( !isInViewport( e.getX(), e.getY() ) )
if( !isInViewport( e.getX(), e.getY() ) ) {
// if it is not in the viewport, retarget the even to a parent container
// which might support scrolling (e.g. a surrounding ScrollPane)
Container parent = getParent();
while (parent != null) {
// informing the first parent with a mouse wheel listener should be sufficient.
if (parent.getMouseWheelListeners().length > 0) {
for (MouseWheelListener parentListener : parent.getMouseWheelListeners()) {
parentListener.mouseWheelMoved(e);
}
return;
}
parent = parent.getContainer();
}
return;
}
lastMouseX = e.getX();
lastMouseY = e.getY();