Event target of mouse and drag-detected events

Werner Lehmann lehmann at media-interactive.de
Mon May 27 06:52:36 PDT 2013


That statement might have been too soon. Consider this FXML:

     <ScrollPane>
       <StackPane>
         <Label text="foo"/>
       </StackPane>
     </ScrollPane>

SceneGraph looks like this:

ScrollPane
  - ScrollPaneSkin
    - StackPane
      - StackPane
        - Label
          - LabelSkin
            - LabeledText

A drag or mouse event with target "Label" (or below) would resolve to 
the (Skinnable) Label, following the parent chain. However, if the event 
target is one of the stackpanes I cannot distinguish "my" stackpane from 
the one used by the scrollpane skin. Generally speaking, any skinned 
node accepting arbitrary children would break this approach.

Do you see an easy (centralized) way out, or would I have to register 
event handlers on each target?

In the latter case I'd have the extra problem of knowing when to 
unregister the event handlers on nodes in my subtree of the scene graph. 
This might actually require to listen on all parent properties of the 
parent chain, probably even with some weak-listeners :-(

Rgds
Werner

On 27.05.2013 14:26, Werner Lehmann wrote:
> Thanks, Pavel. At least now I know that I am not reinventing a wheel and
> actually have to check the parent chain of the drag target.
>
> On 24.05.2013 13:32, Pavel Safrata wrote:
>> Hi Werner,
>> if you don't want to register handlers on the vbox children then yes,
>> this looks like the best thing to do - the system cannot tell which node
>> in the target's parent chain is your desired target, you need to decide
>> that manually.
>>
>> Alternatively, you can have a single handler using the event source and
>> register it directly to the children.
>>
>> Regards,
>> Pavel


More information about the openjfx-dev mailing list