【问题标题】:How to make JavaFX ListProperty modifiable only through custom methods如何仅通过自定义方法使 JavaFX ListProperty 可修改
【发布时间】:2016-01-12 02:03:30
【问题描述】:

我有一个私人列表,我不希望它可以从外部修改。只允许从外部添加,并且仅当对象有效时。所以我以前是这样写的:

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);
}

现在出于 JavaFX 的目的,我将列表转换为属性:

private ListProperty<Object> list =
               new SimpleListProperty<>(FXCollections.observableArrayList());

为了从数据绑定和ListChangeListener 等属性的好处中获利,我必须将属性提供给外部世界。但是随后也提供了对列表的所有方法的访问。 (使用 ReadOnlyListProperty 没有任何效果,因为列表实例本身永远不会改变。)我可以做些什么来实现所有目标:

  • 私有列表属性
  • 可以从外部添加ListChangeListener
  • 可用于从外部绑定依赖项(create 方法形成类 Bindings)
  • 不修改属性或列表实例本身
  • 仅通过我自己的方法从外部修改列表内容

【问题讨论】:

    标签: data-binding javafx unmodifiable listproperty


    【解决方案1】:

    未测试,但尝试:

    private ListProperty<Object> list = new SimpleListProperty<>(FXCollections.observableArrayList());
    
    private ReadOnlyListWrapper<Object> publicList = new ReadOnlyListWrapper<>();
    

    在构造函数中:

    publicList.bind(Bindings.createObjectBinding(
        () -> FXCollections.unmodifiableObservableList(list.getValue()),
        list));
    

    那么你的访问器方法是

    public ReadOnlyListProperty<Object> getList() {
        return publicList.getReadOnlyProperty();
    }
    

    【讨论】:

    • 太好了,我已经测试过了,它似乎可以实现所有目标!但是,您的绑定方法缺少一个括号,并且来自 FXCollections 的方法称为 unmodifiableObservableList()。
    • 如果这解决了您的要求,请记住将其标记为解决方案。
    • @Arceus 感谢您指出错别字(您可以猜到我只是直接输入的):现在已修复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-23
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多