可变对象属性侦听

时间:2014-09-07 09:22:39

标签: javafx javafx-8 observable sortedlist observablelist

如果我有一个按SortedList<PlanItem>排序的IntegerProperty rankProperty个对象,并决定编辑这些项目(在其源列表中),我怎么知道发生了变化?例如,如果我使用list.get(2).setRank(3),那么我需要让SortedList响应并重新排列。我不打算通过每个人并为他们的属性添加一个监听器。例如,可能有30个属性。我只是想让ObsList知道发生了变化。

到目前为止,我知道的唯一方法是将PlanItems视为不可变的,并且只对编辑索引使用set()。这样,SortedList会捕获更改。但我想让我的PlanItems变得可变。它使编码逻辑更容易(虽然不是非常安全)。

更新:ListChangeListener中的以下触发器是wasUpdated()。我只希望它触发一次。

PlanItem a = new PlanItem(), b = new PlanItem();
        ObservableList<PlanItem> src = FXCollections.observableArrayList((PlanItem param) -> {
            return new Observable[]{param.nameProperty(), param.magnitudeProperty()};
        });
        src.addAll(a, b);
        ObservableList<String> bound = FXCollections.observableArrayList();
        CustomBindings.bindLists(bound, src, PlanItem::getName);
        System.out.println(src);
        System.out.println(bound);
        src.get(0).setName("NEW");
        src.get(0).setMagnitude(4);
        System.out.println("SRC: " + src);
        System.out.println("BD: " + bound);

[DEFAULT_NAME [DKJA31], DEFAULT_NAME [9IHCDC]]
[DEFAULT_NAME, DEFAULT_NAME]
UPDATED
UPDATED
SRC: [NEW [DKJA31], DEFAULT_NAME [9IHCDC]]
BD: [DEFAULT_NAME, DEFAULT_NAME]

0 个答案:

没有答案