On Thu, 8 Aug 2024 17:01:47 GMT, Martin Fox <m...@openjdk.org> wrote:
>>> This PR assumes that during dispatch events are copied using copyFor. But >>> the documentation states that an EventDispatcher can do whatever it wants >>> in `dispatchEvent`. A developer could provide a dispatcher that creates >>> entirely new events rather than just copy existing ones and that would >>> break this code. The only thing that’s guaranteed is that the dispatcher >>> will return null to stop event dispatch and that's all that the solution in >>> [JDK-8303209](https://bugs.openjdk.org/browse/JDK-8303209) relies on. >> >> a) If the EventDispatcher does something different like creating the new >> events, it is up to that ED to deal with consequences. It means the >> developer wants to create new events and not to have the link between the >> events. >> >> b) I am not convinced that returning null from a dispatcher is a good >> solution. We already have an API for that: `Event.isConsumed()`. Adding a >> new, parallel paradigm, in my opinion is unnecessary. >> >> The bigger issue I see, as I mentioned earlier, is that >> 1. the `Event` has the target field which is absolutely, totally unnecessary >> (the target already knows who the target is, it is the target) and is an >> anti-pattern because >> 2. it forces the dispatcher to create new event instances for new targets, >> breaking the `isConsumed` logic >> >> I don't think we'll ever change the event dispatching mechanism and remove >> the target field from Event. So the only remaining solutions are little >> hacks and workarounds here and there. >> >> I don't think adding return value to the dispatcher is the right solution. > >> b) I am not convinced that returning null from a dispatcher is a good >> solution. We already have an API for that: `Event.isConsumed()`. Adding a >> new, parallel paradigm, in my opinion is unnecessary. > > We would not be adding anything. Consuming an event is how a developer > communicates to one EventDispatcher that the event was dealt with. But this > information is propagated through the dispatch chain by returning null from > dispatchEvent. That's all in place already. > > There's a variant of `EventUtil.fireEvent` that returns the result of > dispatchEvent so a client can check for null to see if the event was > consumed. And there are already places in the code where this happens. > [JDK-8303209](https://bugs.openjdk.org/browse/JDK-8303209) calls for this to > be cleaned up and made public. @beldenfox : EventUtil is not a public API. Checking the return value of the dispatchEvent is, in my opinion, an anti-pattern. The right pattern is this (TabPaneBehavior:85): public boolean canCloseTab(Tab tab) { Event event = new Event(tab,tab,Tab.TAB_CLOSE_REQUEST_EVENT); Event.fireEvent(tab, event); return ! event.isConsumed(); } Using your own argument, a dev can write a dispatcher which returns garbage from its `dispatchEvent` method, breaking the thing. So I am still not convinced. ------------- PR Comment: https://git.openjdk.org/jfx/pull/1523#issuecomment-2276304526