On Mon, 3 Mar 2025 21:28:13 GMT, John Hendrikx <jhendr...@openjdk.org> wrote:

>> The reason we `should not` be binding in this PR is because in part it's 
>> **bad design(tm)**: we are creating a zillion of listeners (one per plot 
>> data point); a better solution would be to create one listener and use 
>> (already existing series) to toggle the data points.
>> 
>> The other reason is https://bugs.openjdk.org/browse/JDK-8351067 - the 
>> `Platform::accessibilityActive` property getter is not thread safe, but even 
>> if was, registering a listener with it may cause the change to come in 
>> **before** the node becomes a part of the scene graph, leading to 
>> unsynchronized multi-threaded access.
>
> Was this solution considered:
> 
>     ObservableValue<Boolean> partOfSceneGraph = this.sceneProperty()
>       .flatMap(Scene::windowProperty)
>       .flatMap(Window::showingProperty)
>       .orElse(false);
>       
>     symbol.focusTraversableProperty()
>         .bind(Platform.accessibilityActiveProperty().when(partOfSceneGraph));
>         
> What the above code does is create a binding on the `when` statement (a 
> listener is added on the `when` result).  However, the `when` property will 
> not add a listener on `Platform.accessibilityActiveProperty()` until 
> `partOfSceneGraph` is `true`.  As soon as it does though, a listener is 
> installed on  `Platform.accessibilityActiveProperty()` and its latest value 
> is set to `focusTraversableProperty` via the bind.

The above does require though that `Platform.accessibilityActiveProperty()` is 
properly synchronized.  I think it may be a good idea to fix that first.  
Perhaps all platform provided properties (if there are more) should ensure 
they're only initialized once.

-------------

PR Review Comment: https://git.openjdk.org/jfx/pull/1697#discussion_r1978267599

Reply via email to