Re-examine the risks of JDK-8264770 breaking third party libraries and applications.
Michael Strauß
michaelstrau2 at gmail.com
Sun Aug 29 04:18:11 UTC 2021
Thanks for the investigation!
I've prepared a PR that fixes this issue:
https://github.com/openjdk/jfx/pull/614
On Sat, Aug 28, 2021 at 11:02 PM John Hendrikx <hjohn at xs4all.nl> wrote:
>
> This actually isn't an issue because adding an invalidation listener
> revalidates the property as well (I'm not sure why, but I noticed this
> before while working on fluent bindings).
>
> However, there is another issue. When I recreate a bidirectional with
> two invalidation listeners with special logic to ignore my own
> invalidation listener triggering again when the other property gets
> updated.
>
> When you include this logic (using the "updating" field in the current
> code) in combination with invalidation listeners, the field that was
> just updated does NOT get revalidated. Any further changes to that
> field will therefore not trigger an invalidation event and the
> bidirectional nature of the binding breaks.
>
> Try this example:
>
> import javafx.application.Application;
> import javafx.beans.InvalidationListener;
> import javafx.beans.Observable;
> import javafx.beans.property.SimpleDoubleProperty;
> import javafx.stage.Stage;
>
> public class TestBug8264770 extends Application {
>
> public static void main(String[] args) {
> Application.launch(args);
> }
>
> static SimpleDoubleProperty p1 = new SimpleDoubleProperty(2);
> static SimpleDoubleProperty p2 = new SimpleDoubleProperty(3);
>
> @Override
> public void start(Stage stage) throws Exception {
> InvalidationListener invalidationListener = obs -> invalidated(obs);
>
> p1.addListener(invalidationListener);
> p2.addListener(invalidationListener);
>
> p1.setValue(4);
> p2.setValue(5);
>
> // Prints p1 = 4.0 (!!)
> System.out.println("Expect p1 to be 5, but was: " + p1.getValue());
> }
>
> private boolean updating = false;
>
> private void invalidated(Observable source) {
> if (!updating) {
> try {
> updating = true;
>
> if(source == p1) {
> System.out.println("Setting p2 to " + p1.get());
> p2.set(p1.get());
> }
> else {
> System.out.println("Setting p1 to " + p2.get());
> p1.set(p2.get());
> }
> }
> finally {
> updating = false;
> }
> }
> }
> }
>
> --John
>
More information about the openjfx-dev
mailing list