Content Graph

John Hendrikx john.hendrikx at gmail.com
Wed Apr 19 15:16:46 UTC 2023


On 18/04/2023 19:14, Michael Strauß wrote:
> Here's a draft PR: https://github.com/openjdk/jfx/pull/1096
>
> There are some API changes compared to my last email, the most notable
> being that the content graph can now contain arbitrary objects. This
> allows the content graph to directly contain a ListView's item list,
> or a Labeled's text.

I've looked it over a bit. Would it be needed to have wrappers around 
some parts of the content graph now that it supports arbitrary objects?

ie. instead of:

     MenuItem
         String
         Rectangle

with wrappers:

     MenuItem
         Label
              String
         Graphic
              Rectangle

The reason I ask is I wonder if the type itself will always be 
sufficient to distinguish the various parts a control adds to the 
content graph.  A ListView's items for example could be arbitrary 
objects; if ListView contributed anything other than its items, it would 
be hard to pick it out.

Or consider a control that for some reason has two texts; I have some 
reusable controls that display an image, a text on top (title) and a 
text at the bottom (subtitle).  These are all labels:

      FancyControl
           String (Label with text only)
           String (Label with text only)
           Image (Label with graphic only)


>
>> Would the returned list here be read only?
> The content graph API is read-only, as its state depends entirely on
> the properties of the participating controls.
Okay, my confusion stems from that there are ReadOnly interfaces for 
properties, but apparently not for ObservableList.  Read only seems good 
to me.
>
>> For a lot of controls I think the content nodes will be fixed
>> (SplitPane, Label, Button), but for others like MenuButton or containers
>> these need to be modified. Does it make sense to use a similar model
>> here that is used for properties? Some controls would still need to be
>> able to modify the list directly, in which case subclasses could go that
>> route as well, circumventing these protections.
> I'm not entirely sure if I understand the problem. For example, the
> content model of Pane corresponds exactly to its children list. If a
> subclass of Pane needs to add something that is not a child, for
> example a "text" or "graphic", it simply adds its own content model in
> the subclass. The combined content model of the control will then
> consist of the entire children list of Pane, as well as the custom
> properties that the subclass added.
>
> In this case, the subclass will not be able to change the fact that
> Pane added its children to the content model. That is by design, as a
> subclass of Pane is still a Pane, after all.

I see that you went a different route here, without using an overridable 
`buildContentModel` (subclasses could not call `super` and in that way 
influence what the parent has as content model).

I guess what is happening is that there are multiple ObservableLists 
that are being concatenated; each individual list is under control of a 
single class, and a subclass can't access the list of its superclass in 
any way.

--John



More information about the openjfx-dev mailing list