Data binding 如何使JavaFXListProperty只能通过自定义方法进行修改

Data binding 如何使JavaFXListProperty只能通过自定义方法进行修改,data-binding,javafx,unmodifiable,listproperty,Data Binding,Javafx,Unmodifiable,Listproperty,我有一个私人名单,我不希望它可以从外面修改一般。仅当对象有效时,才允许从外部添加。因此,我过去常常这样写: private List<Object> list = new ArrayList<>(); public List<Object> getList() { return Collections.unmodifiableList(list); } public void addObject(Object object) { if (i

我有一个私人名单,我不希望它可以从外面修改一般。仅当对象有效时,才允许从外部添加。因此,我过去常常这样写:

private List<Object> list = new ArrayList<>();

public List<Object> getList()
{
    return Collections.unmodifiableList(list);
}

public void addObject(Object object)
{
    if (isObjectValid(object)) //any validation
        list.add(object);
}
private List=new ArrayList();
公共列表getList()
{
返回集合。不可修改列表(列表);
}
公共无效添加对象(对象)
{
if(isObjectValid(object))//任何验证
列表。添加(对象);
}
现在,出于JavaFX的目的,我将列表转换为一个属性:

private ListProperty<Object> list =
               new SimpleListProperty<>(FXCollections.observableArrayList());
私有列表属性列表=
新的SimpleListProperty(FXCollections.observableArrayList());
要从数据绑定和
ListChangeListener
等属性的好处中获益,我必须向外部世界提供该属性。但是,也提供了对列表中所有方法的访问。(使用ReadOnlyListProperty没有任何效果,因为列表实例本身永远不会更改。)如何实现所有目标:

  • 私有财产
  • ListChangeListener可以从外部添加
  • 可用于从外部绑定依赖项(创建方法形成类绑定)
  • 不修改属性或列表实例本身
  • 仅通过我自己的方法从外部修改列表内容
    • 未测试,但请尝试:

      private ListProperty<Object> list = new SimpleListProperty<>(FXCollections.observableArrayList());
      
      private ReadOnlyListWrapper<Object> publicList = new ReadOnlyListWrapper<>();
      
      那么您的访问器方法是

      public ReadOnlyListProperty<Object> getList() {
          return publicList.getReadOnlyProperty();
      }
      
      公共ReadOnlyListProperty getList(){ 返回publicList.getReadOnlyProperty(); }
      太好了,我已经测试过了,它似乎实现了所有目标!但是,您的bind方法缺少括号,FXCollections中的方法称为unmodifiableObservableList()。如果这解决了您的需求,请记住将其标记为解决方案。@Arceus感谢您指出错误(您可以猜到我只是直接键入了它):现在已修复。
      public ReadOnlyListProperty<Object> getList() {
          return publicList.getReadOnlyProperty();
      }