Прослушивание свойства изменяемого объекта

Если у меня есть SortedList<PlanItem> объекты, отсортированные по их IntegerProperty rankProperty, и я решу отредактировать эти элементы (в их исходном списке), как я узнаю, что произошло изменение? Например, если я использую list.get(2).setRank(3), мне нужно, чтобы SortedList ответил и перестроил себя. Я не собираюсь проходиться по каждому из них и добавлять слушателя к их свойствам. Например, может быть 30 свойств. Я просто хочу сообщить ObsList, что произошли изменения.

До сих пор единственный известный мне способ - рассматривать PlanItems как неизменяемые и использовать set() только для индекса редактирования. Таким образом, SortedList ДЕЙСТВИТЕЛЬНО улавливает изменения. Но я хочу сделать свои PlanItems изменчивыми. Это значительно упрощает логику кодирования (хотя и не очень многопоточно).

Обновление: следующие триггеры wasUpdated() в ListChangeListener. Я хочу, чтобы он срабатывал только один раз.

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]

person Toni_Entranced    schedule 07.09.2014    source источник
comment
Ах да, я помню! Означает ли это, что я должен предоставлять экстрактор и каждый раз вручную сопоставлять КАЖДОЕ свойство? Я чувствую, что могу предоставить PlanItem с измененным собственным BooleanProperty, и это каким-то образом срабатывает всякий раз, когда вызывается любой из других сеттеров. Но это означало бы, что он будет срабатывать несколько раз. Если я изменю 5 свойств, я хочу, чтобы обновление запускалось только один раз. Кроме того, я заметил, что функция wasUpdated() была активирована в моей привязке пользовательского списка.   -  person Toni_Entranced    schedule 08.09.2014
comment
не понимаю логики: если изменение свойства требует обновления в списке, так тому и быть - если нет, то не добавляйте это свойство. Почему вы хотите получать уведомления только один раз? И один раз за что?   -  person kleopatra    schedule 09.09.2014
comment
Допустим, я нахожусь в другом окне и в настоящее время изменяю элемент из ObservableList. Это окно редактора позволяет предварительно просмотреть его свойства и ввести новые. Когда вы нажимаете «Сохранить», этот элемент получает множество вызовов setXYZ(). Естественно, это приведет к срабатыванию флага wasUpdated() столько раз, сколько будут вызваны эти установщики. Это кажется немного расточительным для ресурсов, потому что вы будете многократно вызывать set(). Я просто хочу, чтобы он вызывался один раз после того, как были вызваны все сеттеры.   -  person Toni_Entranced    schedule 09.09.2014