【问题标题】:Is it possible in JavaFX to modify the dependencies of a binding after it's created?JavaFX 是否可以在创建绑定后修改绑定的依赖关系?
【发布时间】:2022-11-01 16:46:08
【问题描述】:

使用 JavaFX 实现某种图形可视化时出现了我的问题。有 2 个类称为 VertexEdge,每条边连接 2 个(可能相同)顶点。每个具有自环的顶点(具有相同开始和结束顶点的边)存储一个DoubleProperty 用于其自环的首选角度。该角度是根据该顶点及其所有邻居的位置计算得出的。但是,由于图形是动态构建的,顶点的邻居可能会发生变化,从而产生动态的依赖关系列表,因此我必须修改角度绑定到的DoubleBinding 的依赖关系。

但是,Bindings.createDoubleBinding 创建的DoubleBinding 中的getDependencies 方法只返回一个不可变的副本:

@Override
public ObservableList<?> getDependencies() {
    return  ((dependencies == null) || (dependencies.length == 0))?
                FXCollections.emptyObservableList()
            : (dependencies.length == 1)?
                FXCollections.singletonObservableList(dependencies[0])
            : new ImmutableObservableList<Observable>(dependencies);
}

尽管DoubleBinding 类有一个似乎满足我需要的bind 方法,但它受到了保护:

protected final void bind(Observable... dependencies) {
    if ((dependencies != null) && (dependencies.length > 0)) {
        if (observer == null) {
            observer = new BindingHelperObserver(this);
        }
        for (final Observable dep : dependencies) {
            dep.addListener(observer);
        }
    }
}

那么有什么方法可以让我随时修改依赖项而不定义我自己的DoubleBinding,或者我可以在不接触依赖项的情况下解决我的问题吗?

【问题讨论】:

    标签: java javafx properties


    【解决方案1】:

    您可以编写自己的 DoubleBinding 实现来提供所需的方法和行为。

    class MuatableDependenciesDoubleBinding extends DoubleBinding {
    
      private Callable<Double> func;
      private Observable[] dependencies;
    
      public MuatableDependenciesDoubleBinding (Callable<Double> func, Observable... dependencies) {
        this.func = func;
        this.dependencies = dependencies;
        bind (dependencies);
      }
    
      @Override 
      protected double computeValue() {
        try {
          return func.call();
        } catch(Exception e) {
          Logging.getLogger().warning("Exception while evaluating binding", e);
          return 0.0;
        }
      }
    
      @Override 
      public void dispose() {
        super.unbind(dependencies);
      }
    
      @Override
      public ObeservableList<?> getDependencies() {
          return ((dependencies == null) || (dependencies.length == 0)) ? 
            FXCollection.emptyObservableList() : (dependencies.length == 1) ? 
            FXCollections.singeltonObservableList(dependencies[0]) 
            : new ImmutableObservableList<Observable>(dependencies);
      }
    
      public void updateDependencies(Observable... dependencies) {
        this.dependencies = dependencies;
        dispose();
        bind(dependencies);
      }
    
    }
    

    也许是这样的。 (我没有测试过代码)

    【讨论】:

      猜你喜欢
      • 2012-05-26
      • 1970-01-01
      • 1970-01-01
      • 2016-05-09
      • 2011-08-04
      • 2017-06-01
      • 1970-01-01
      • 2016-07-13
      • 2022-11-08
      相关资源
      最近更新 更多