How to grab mouse click in top-level component?


#1

Seems like there should be a straightforward way to do this, so I’m hoping I’m just missing someting obvious… So, I have a top-level component that has a bunch of subcomponents in it (sliders etc). Normally the subcomponents should handle mouse clicks and do their thing, and that all works automatically. But, if the user right-clicks anywhere on the top-level component (including clicking on top of any of the subcomponents), I want to display a popup menu. It’s going to be the same menu no matter where they click, so I want to handle it in the top-level component code. I know how to display the menu etc, but how do I intercept the mouse click in the top-level component before any subcomponents get a shot at it, and only do something with it if certain modifiers are set, but otherwise have it dispatch the mouse click to the appropriate subcomponent as usual?


#2

You can use Component::addMouseListener to intercept events for all child components.


#3

Thanks. I had looked at that but couldn’t see how to prevent the event from propagating once the MouseListener handled it. I would want to install a MouseListener on the component (specifying true for wantsEventsForAllNestedChildComponents), and in that listener I’d check for a right-click and display my popup menu. But, if I actually handle the click and display the popup, I don’t want the event to still be handled by the underlying component after I’m done with it. How do I do that?


#4

Hmm, there’s currently no way to stop an event propagating…


#5

Ah. Well consider it a feature request. Would be very useful for doing something like what I’m trying to do, which honestly seems like it should be fairly straightforward. I believe PowerPlant had a kinda similar functionality via “Attachments”. That was a little more general mechanism but the idea applies. You could specify whether or not the host you attached to should handle the event after your attachment code got a shot at it.

But in lieu of that… what’s the best way to do what I want to do? Change all the subcomponents to check for a right-click and not do anything in that case?


#6

Yeah, it’d actually be quite difficult to add a feature like that, because events don’t really ‘propagate’ via the parent components, they get sent directly to the target component, having selected it with hitTest. I’ll have a think about it.