On Sun, 5 Feb 2023 13:07:25 GMT, John Hendrikx <jhendr...@openjdk.org> wrote:
> This PR contains changes to make it easier to implement properties which want > to conserve resources until they're observed themselves. > > `isObserved` is promoted from `ObjectBinding` to the `ObservableValue` > interface, allowing you to ask any `ObservableValue` if it is currently > observed (ie. if it has any listeners registered on it). All JavaFX > `ObservableValue`s implementations are modified to implement this method. > > The protected methods `observed` and `unobserved` are added to all extendable > (non final) `ObservableValue`s provided by JavaFX. The `observed` call back > is only called when the observable currently has 0 listeners and will soon > have 1 listener. During the call back, `isObserved` still returns `false` > (see below for why this was chosen). The `unobserved` call back is only > called when the last listener was removed and the observable has 0 listeners. > During the call back, `isObserved` will already return `false`. > > The reason why `observed` is called before `isObserved` starts returning > `true` (and also why `unobserved` works the opposite) is to make it easy to > implement a parent-child relationship where a nested property becoming > observed may need to trigger behavior in its parent. Given a parent class and > two nested properties `foo` and `bar`: > > class FooProperty extends ObjectPropertyBase<Foo> { > void observed() { > nestedPropertyObserved(); // call to parent > } > > void unobserved() { > nestedPropertyUnobserved(); // call to parent > } > } > > The parent may determine whether any of the properties is observed with a > helper: > > private boolean isANestedPropertyObserved() { > return foo.isObserved() || bar.isObserved(); > } > > The `nestedPropertyObserved` and `nestedPropertyUnobserved` methods can now > be implemented simply as: > > private void nestedPropertyObserved() { > if (!isANestedPropertyObserved()) { > // take action as no properties were observed before, but now > one will become observed > } > } > > private void nestedPropertyUnobserved() { > if (!isANestedPropertyObserved()) { > // take action as a property was observed before, but the > last listener is about to be removed > } > } > > If `isObserved` would change immediately, this becomes more difficult as the > observed status of the property that has just become observed would need to > be excluded to determine if this is the... This pull request has been closed without being integrated. ------------- PR: https://git.openjdk.org/jfx/pull/1023