-
Notifications
You must be signed in to change notification settings - Fork 504
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
8290040: Provide simplified deterministic way to manage listeners #830
Conversation
Introduced with the fluent bindings PR
👋 Welcome back jhendrikx! A progress list of the required criteria for merging this PR into |
modules/javafx.base/src/main/java/javafx/beans/value/ObservableValue.java
Show resolved
Hide resolved
Webrevs
|
/csr |
@kevinrushforth has indicated that a compatibility and specification (CSR) request is needed for this pull request. @hjohn please create a CSR request for issue JDK-8290040 with the correct fix version. This pull request cannot be integrated until the CSR request is approved. |
@kevinrushforth |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I reviewed the docs so a CSR can be submitted. Will do the implementation and tests reviews later. The implementation looks fine, but I need to review the subscription model closely.
modules/javafx.base/src/main/java/javafx/beans/value/ObservableValue.java
Outdated
Show resolved
Hide resolved
modules/javafx.base/src/main/java/javafx/beans/value/ObservableValue.java
Outdated
Show resolved
Hide resolved
modules/javafx.base/src/main/java/javafx/beans/value/ObservableValue.java
Outdated
Show resolved
Hide resolved
modules/javafx.base/src/main/java/javafx/beans/value/ObservableValue.java
Outdated
Show resolved
Hide resolved
modules/javafx.base/src/main/java/javafx/beans/value/ObservableValue.java
Outdated
Show resolved
Hide resolved
modules/javafx.base/src/main/java/javafx/beans/value/ObservableValue.java
Outdated
Show resolved
Hide resolved
modules/javafx.base/src/main/java/javafx/beans/value/ObservableValue.java
Outdated
Show resolved
Hide resolved
modules/javafx.base/src/main/java/javafx/beans/value/ObservableValue.java
Outdated
Show resolved
Hide resolved
modules/javafx.base/src/main/java/javafx/beans/value/ObservableValue.java
Outdated
Show resolved
Hide resolved
modules/javafx.base/src/main/java/javafx/beans/value/ObservableValue.java
Outdated
Show resolved
Hide resolved
Mailing list message from John Hendrikx on openjfx-dev: Please ignore the explanation below it is incorrect (I forgot that I've updated the comment on Github, not sure if these edits will show on --John On 01/09/2022 15:14, John Hendrikx wrote: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The docs of when
look good now (I left one minor comment). I actually didn't think about the name of the method, compared to ReactFX's conditionOn
for example, but this is good enough until others review.
I haven't looked at the addition to Node
closely yet. I will look at the implementation and tests of the method itself first because Node
is a use case.
modules/javafx.base/src/main/java/javafx/beans/value/ObservableValue.java
Show resolved
Hide resolved
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Implementation and tests look good. Left a few minor comments.
in ObjectBinding.java
, the change in a previous PR was integrated. I think that you need to merge master to not show this as a change in this PR.
I will have a look at the changes to Node
soon. I'm not sure if they need to be in this PR, but I personally don't mind. Will also do some sanity checks manually to see that the binding functions the way I think it should (as I have done in the previous fluent binding PR), but I don't foresee any issues.
modules/javafx.base/src/main/java/com/sun/javafx/binding/ConditionalBinding.java
Outdated
Show resolved
Hide resolved
modules/javafx.base/src/main/java/com/sun/javafx/binding/ConditionalBinding.java
Outdated
Show resolved
Hide resolved
modules/javafx.base/src/main/java/com/sun/javafx/binding/ConditionalBinding.java
Show resolved
Hide resolved
modules/javafx.base/src/test/java/test/javafx/beans/value/LazyObjectBindingTest.java
Outdated
Show resolved
Hide resolved
...les/javafx.base/src/test/java/test/javafx/beans/value/ObservableValueFluentBindingsTest.java
Show resolved
Hide resolved
feature/conditional-bindings # Conflicts: # modules/javafx.base/src/test/java/test/javafx/beans/value/LazyObjectBindingTest.java
I've merged in master.
It would be good to have changes in |
In the past, a form of this property already existed as part of As I think the property is still useful (internally as well as publicly) putting it back in a form that won't cause performance issues seemed reasonable. However, good arguments can be made to leave it out. Currently there are three concepts within Node (all private):
My idea here was to make
I suppose so; my main reason for making it a lot more visible is because of how important I think it is for deterministic listener management in UI's. The reasoning here is that if it is very visible it is discovered more easily, and it can be made good use of in examples to help people do the right thing -- combined with the fact that there apparently is some internal need for such properties as well. Then again, I agree that a helper class is not a too big of a compromise (I'd go for It's primary use case is to remove the need for weak listeners; it's not common that people remove listeners when things become invisible or are covered by something else -- when a control is invisible, it's main cost (rendering) is already gone, any updates that would affect its appearance will be deferred anyway until it becomes visible, so removing the listeners in those cases is not that urgent. So I think listeners are usually only removed when a piece of UI is going to be disposed permanently (this is also how weak listeners work, as they can't work in any other way). The closest I've managed to get to "is going to be disposed" is to use |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In order to move this forward, please revert the changes in javafx.graphics
and file a follow-up Enhancement in JBS that we can use to separately discuss adding such a property to Node
.
I also think it might be cleanest to remove the second example from the when
API docs as a result.
Once you have reverted the changes in Node
, please update the CSR to reflect this. You can then move the CSR to Proposed
.
modules/javafx.base/src/main/java/javafx/beans/value/ObservableValue.java
Outdated
Show resolved
Hide resolved
I updated the CSR to remove all references to the changes in |
The update to revert |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good. The additional tests for when
look to be quite thorough and are very easy to follow. I left one minor formatting comment. I'll reapprove if you fix that.
...les/javafx.base/src/test/java/test/javafx/beans/value/ObservableValueFluentBindingsTest.java
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
lgtm
@hjohn This change now passes all automated pre-integration checks. ℹ️ This project also has non-automated pre-integration requirements. Please see the file CONTRIBUTING.md for details. After integration, the commit message for the final commit will be:
You can use pull request commands such as /summary, /contributor and /issue to adjust it as needed. At the time when this comment was updated there had been no new commits pushed to the As you do not have Committer status in this project an existing Committer must agree to sponsor your change. Possible candidates are the reviewers of this PR (@nlisker, @andy-goryachev-oracle, @kevinrushforth, @mstr2) but any other Committer may sponsor as well. ➡️ To flag this PR as ready for integration with the above commit message, type |
/integrate |
/sponsor |
This PR adds a new (lazy*) property on
Node
which provides a boolean which indicates whether or not theNode
is currently part of aScene
, which in turn is part of a currently showingWindow
.It also adds a new fluent binding method on
ObservableValue
dubbedwhen
(open for discussion, originally I hadconditionOn
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: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 bylabel::isShowingProperty
isfalse
. 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: #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.
Progress
Issues
Reviewers
Reviewing
Using
git
Checkout this PR locally:
$ git fetch https://git.openjdk.org/jfx pull/830/head:pull/830
$ git checkout pull/830
Update a local copy of the PR:
$ git checkout pull/830
$ git pull https://git.openjdk.org/jfx pull/830/head
Using Skara CLI tools
Checkout this PR locally:
$ git pr checkout 830
View PR using the GUI difftool:
$ git pr show -t 830
Using diff file
Download this PR as a diff file:
https://git.openjdk.org/jfx/pull/830.diff