There's a larger picture here: from a user perspective, there's a difference between the scene graph and the "document graph". The document graph is what users actually work with, for example by setting the `Labeled.graphic` property. In some cases, document nodes don't correspond to scene nodes at all (`MenuItem` or `Tab` come to mind). The document graph is later inflated into a scene graph of unknown structure (because skins are mostly black boxes with regards to their internal structure).
I've proposed an enhancement that would make the document graph a first-class citizen: https://mail.openjdk.org/pipermail/openjfx-dev/2022-June/034417.html With this in place, we could simply disallow the same node appearing multiple times in the document graph, which would not only solve the problem for `Labeled`, but for all controls with a similar problem. On Thu, Dec 1, 2022 at 6:17 PM John Hendrikx <john.hendr...@gmail.com> wrote: > > The mechanism does seem like it is a bit poorly designed, as it is easy to > create inconsistencies. > > Luckily it seems that you can't remove a graphic yourself from a Control > (getChildren is protected). > > I don't think there is an easy solution though... > > I think that once you set a graphic on a Labeled, you need to somehow mark it > as "in use". Normally you could just check parent != null for this, but it > is trickier than that. The Skin ultimately determines if it adds the graphic > as child, which may be delayed or may even be disabled (content display > property is set to showing TEXT only). > > Perhaps Skins should always add the graphic and just hide it (visible false, > managed false), but that's going to be hard to enforce. > > Marking the graphic as "in use" could be done with: > > - a property in `getProperties` > - a new "owner" or "ownedBy" property > - allowing "parent" to be set without adding it to children (probably going > to mess up stuff) > > --John