В некоторых контекстах необходимо обнаружить - в ListChangeListener, без контроля над самим списком - «все данные поменялись», f.i. когда нам нужно очистить какое-то состояние, например отбор - на совершенно новых данных старое состояние бессмысленно.ObservableList: как надежно обнаружить setAll?
Совершенно новые данные могут быть достигнуты
- list.setAll (...)
- list.set (otherObservableList), если список является ListProperty
Думая о каком типе изменения могут быть запущены на setAll (c - изменение, элементы - наблюдаемый список, псевдокод subChangeCount для подсчета подклассов):
// initially empty
assertEquals(0, items.size());
items.setAll(1, 2, 4);
assertEquals(1, c.subChangeCount());
assertTrue(c.wasAdded() && !c.wasReplaced());
assertEquals(0, c.getFrom());
assertEquals(c.getList().size(), c.getAddedSize());
// initially not empty
assertTrue(items.size() > 0);
items.setAll(1, 2, 4);
assertEquals(1, c.subChangeCount());
assertTrue(c.wasReplaced());
assertEquals(0, c.getFrom());
assertEquals(c.getList().size(), c.getAddedSize());
Это, кажется, позволяет проверку полезности как:
boolean wasSetOrClearedAll(Change c) {
if (c.getList().isEmpty()) return true;
c.next();
if (c.getAddedSize() == c.getList().size()) return true;
return false;
}
В отличие от этого, внутренний код FX, F.I. слушая COMBOBOX»пунктов:
while (c.next()) {
comboBox.wasSetAllCalled = comboBox.previousItemCount == c.getRemovedSize();
...
}
comboBox.previousItemCount = getItemCount();
хранит старый ITEMCOUNT, и сравнить с текущим removedSize (который я неудобно, старое состояние становится несвежим слишком часто, на мой вкус), тем не менее, есть хорошая вероятность что я что-то пропускаю с моим подходом.
Вопрос:
, в каком контексте будет мой метод утилита не в состоянии (и основной подход позволил бы обнаружить SetAll правильно)?
Каков конкретный тип наблюдаемого списка, который вы используете? Похоже, ListProperty является абстрактным классом, который не объявляет setAll (...) – Zeki
@zeki hmm .. все ObservableLists должны иметь setAll (T ... item) - конечно, без поддержки, поэтому возьмите все, что имеет его (ListProperty ничего особенного, он просто маршрутизирует setAll его резервного списка) – kleopatra
В этом случае вы можете расширить ListProperty и запустить setAll событие перед вызовом супер метода? – Zeki