JavaFX:只更新所有依赖项后更新绑定?

时间:2016-06-23 20:49:14

标签: java javafx concurrency

private final Property<BigDecimal> a = new SimpleObjectProperty<BigDecimal>();
private final Property<BigDecimal> b = new SimpleObjectProperty<BigDecimal>();

private ObjectBinding<BigDecimal> c = new ObjectBinding<BigDecimal>() {
    {
        super.bind(a, b);
    }

    @Override
    protected BigDecimal computeValue() {
        return a.getValue().add(b.getValue());
    }
};
public BigDecimal getC() { return c.getValue(); }

我有两个属性和一个绑定到这些属性之和的值。我有一个线程正在查看c并在更改时调用getC(),另一个线程应该更新a&amp; b。我想更新a&amp; b是原子的;我不希望在更新ca没有更新b时观察c的值。

我想出的解决方案是使用update(a, 1); update(b, 2); update(updateComplete, true); // C is only computed at this point private final Property<BigDecimal> a = new SimpleObjectProperty<BigDecimal>(); private final Property<BigDecimal> b = new SimpleObjectProperty<BigDecimal>(); private final IntegerProperty updateComplete = new SimpleIntegerProperty(0); private ObjectBinding<BigDecimal> c = new ObjectBinding<BigDecimal>() { { super.bind(updateComplete); } @Override protected BigDecimal computeValue() { return a.getValue().add(b.getValue()); } }; public BigDecimal getC() { return c.getValue(); } 绑定的第三个属性作为标志来表示更新完成,例如

<fieldset disabled id="homeFieldset">...</fieldset>

这个问题是否有更惯用的解决方案?

1 个答案:

答案 0 :(得分:0)

一种可能的解决方案,虽然我不称之为惯用语;),是为c提供2种不同的绑定。两个绑定都具有相同的computeValue方法,但其中一个绑定仅a(或b,具体取决于您的需要。)

线程查看c将获得对绑定的访问权限,只有在一个值发生更改时才会更新。

private final ObjectBinding<BigDecimal> c              = new ObjectBinding<BigDecimal>()
                                                     {
                                                       {
                                                         super.bind( a, b );
                                                       }

                                                       @Override
                                                       protected BigDecimal computeValue()
                                                       {
                                                         return a.getValue().add( b.getValue() );
                                                       }
                                                     };

private final ObjectBinding<BigDecimal> cOnlyOnBChange = new ObjectBinding<BigDecimal>()
                                                     {
                                                       {
                                                         super.bind( b );
                                                       }

                                                       @Override
                                                       protected BigDecimal computeValue()
                                                       {
                                                         return a.getValue().add( b.getValue() );
                                                       }
                                                     };

请参阅full example