This PR adds a new (lazy*) property on `Node` which provides a boolean which 
indicates whether or not the `Node` is currently part of a `Scene`, which in 
turn is part of a currently showing `Window`.

It also adds a new fluent binding method on `ObservableValue` dubbed `when` 
(open for discussion, originally I had `conditionOn` here).

Both of these together means it becomes much easier to break strong references 
that prevent garbage collection between a long lived property and one that 
should be shorter lived. A good example is when a `Label` is bound to a long 
lived property:

     
label.textProperty().bind(longLivedProperty.when(label::isShowingProperty));

The above basically ties the life cycle of the label to the long lived property 
**only** when the label is currently showing.  When it is not showing, the 
label can be eligible for GC as the listener on `longLivedProperty` is removed 
when the condition provided by `label::isShowingProperty` is `false`.  A big 
advantage is that these listeners stop observing the long lived property 
**immediately** when the label is no longer showing, in contrast to weak 
bindings which may keep observing the long lived property (and updating the 
label, and triggering its listeners in turn) until the next GC comes along.

The issue in JBS also describes making the `Subscription` API public, but I 
think that might best be a separate PR.

Note that this PR contains a bugfix in `ObjectBinding` for which there is 
another open PR: https://github.com/openjdk/jfx/pull/829 -- this is because the 
tests for the newly added method would fail otherwise; once it has been 
integrated to jfx19 and then to master, I can take the fix out.

(*) Lazy means here that the property won't be creating any listeners unless 
observed itself, to avoid problems creating too many listeners on Scene/Window.

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

Commit messages:
 - Add conditional bindings to ObservableValue
 - Change explanatory comment to block comment
 - Fix bug where ObjectBinding returns null when revalidated immediately

Changes: https://git.openjdk.org/jfx/pull/830/files
 Webrev: https://webrevs.openjdk.org/?repo=jfx&pr=830&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8290040
  Stats: 587 lines in 7 files changed: 576 ins; 8 del; 3 mod
  Patch: https://git.openjdk.org/jfx/pull/830.diff
  Fetch: git fetch https://git.openjdk.org/jfx pull/830/head:pull/830

PR: https://git.openjdk.org/jfx/pull/830

Reply via email to