JavaFx 8 双向绑定(bind)

标签 java data-binding javafx javafx-8

以下代码引发java.lang.RuntimeException:无法设置绑定(bind)值:

public class Test {

   public static void main( String[] args ) {
      final DoubleProperty amount = new SimpleDoubleProperty( 100_000.00 );
      final DoubleProperty rate   = new SimpleDoubleProperty();
      final DoubleProperty part   = new SimpleDoubleProperty();
      rate.bind( part.divide  ( amount.getValue()));
      part.bind( rate.multiply( amount.getValue()));
      rate.set( 0.025 );//<<----------------------------------- Here is the cause
      System.out.println( "Part: " + part.get());
      part.set( 1200 );
      System.out.println( "Rate: " + rate.get());
   }
}

使用Bindings.bindBidirectional可能是一个解决方案,但我不知道如何解决。

最佳答案

一个可能的解决方案是创建 InvalidationListeners - 不使用绑定(bind)。

它是如何工作的:

  • 设置费率会导致费率无效。这是设置部分的时间,因此也是无效的。
  • 依次设置速率不会再次触发 InvalidationListener。这就是它的定义方式。

.

public static void main(String[] args) {
    final DoubleProperty amount = new SimpleDoubleProperty(100_000.00);
    final DoubleProperty part = new SimpleDoubleProperty();
    final DoubleProperty rate = new SimpleDoubleProperty();

    part.addListener(new InvalidationListener() {
        @Override
        public void invalidated(Observable observable) {
            System.out.println("part is invalid");
            rate.set(part.get() / amount.get());
        }
    });

    rate.addListener(new InvalidationListener() {
        @Override
        public void invalidated(Observable observable) {
            System.out.println("rate is invalid");
            part.set(rate.get() * amount.get());
        }
    });

    System.out.println("setting rate");
    rate.set(0.025);
    System.out.println("Part: " + part.get()); //2500

    System.out.println("setting part");
    part.set(1200);
    System.out.println("Rate: " + rate.get()); //0.012
}

上面代码的输出是:

setting rate
rate is invalid
part is invalid
Part: 2500.0
setting part
part is invalid
rate is invalid
Rate: 0.012

关于JavaFx 8 双向绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27746622/

相关文章:

java - 如何在java中获取当前服务器时间(unix服务器)?

angularjs - ng-click 在移动或平板设备上触发

javafx webview加载本地css文件

java - 让 JavaFX 应用程序在动画之间等待

c# - 对 ListView 和 DataContext 的一些不满

javafx - 标题 Pane 子项将父项设置为延迟

java - 在 Java Spring MVC 中的所有(或大部分) Controller 中进行相同的方法调用并设置属性

java - 客户端服务器应用程序是如何实现的? (服务器端)(询问概念)

java - 类加载器(和 Guice)表现得很奇怪

Android 子类的数据绑定(bind)