I would be interested to know what use cases for these are, and what would be then left of the use cases for the existing focusWithin and focusVisible properties?  The ticket referred doesn't give one and only reports a bug.

Before implementing a second set of these types of properties, I would like to know:

- What would be the distinct uses for focusOwnerWithin vs focusWithin, are both actually needed? - Isn't focusOwnerProperty basically a "better" focusedProperty now because of how focusedProperty is abused by some controls? - Why indeed is TableView doing this and should it really be doing this instead of doing this another way?  If it just wants to show nodes in their focused style, that can (and should IMHO) be achieved differently.

There seems to be a need to have some controls retain their focused look without them actually being the focus owner. TableView seems to be one of them, and I personally have another (I would like Nodes to keep looking focused even when their Stage has lost focus). The focused look relies on the `focused` pseudo class, which is now strictly controlled by the focusedProperty. It may be a good idea to look in another direction; one could change the style sheet for example to also have controls in focused look when they have a different pseudo class, say `fake-focused`.  TableView could then use this (and so could I).

With the TableView problem solved, the original focusWithin, focusVisible and focused properties then can serve the purposes they were intended for, instead of basically replacing them with a new set that acts slightly differently to work around a problem with TableView.

If this does move forward though, I wonder why these need to be properties specifically, given how hesistant we were to add properties to Node?  The `shownProperty` which IMHO has far more uses given the essential role it can play in deterministic clean-up was rejected over such an argument.  Why isn't simply checking the psuedoClassState sufficient for these properties: `getPseudoClassStates().contains(FOCUS_OWNER_PSEUDOCLASS_STATE)`?

--John

On 07/10/2023 23:00, Michael Strauß wrote:
JavaFX has two closely related focus concepts: `Node.focused`, which
can apply to any number of nodes in a scene graph, and
`Scene.focusOwner`, which is the single node in a scene graph that
accepts user input.

JavaFX 19 added `Node.focusWithin`, which is a flag set on any node
that contains a `focused` node. However, there is no flag on `Node`
for the single focus owner, and also no flag that is set if a node
contains the single focus owner.

Tickets like [0] show that there might be a need for these additional
flags. One could argue that it might not be the best idea to set the
`focused` flag on a node that is not the focus owner (TableView does
this quite a lot), but I think that ship has sailed.

I've prepared a draft PR [1] that shows the proposed API of this
enhancement. The functionality can in theory be implemented by
applications, since the `Scene.focusOwner` property is already
available, but this is far from easy (especially when CSS is
involved).

I'm interested in your thoughts on whether this is an API that we want
to have in JavaFX.

[0] https://bugs.openjdk.org/browse/JDK-8317426
[1] https://github.com/openjdk/jfx/pull/1255

Reply via email to