首先你可以添加在Gender
一個新的枚舉值表示未知性別:
public enum Gender { MALE, FEMALE, UNKNOWN }
。
然後你可以使用一個像ListChangeListener
:
this.people = FXCollections.observableArrayList(person -> new Observable[] {person.genderProperty()});
ListChangeListener<Person> listener = new ListChangeListener<Person>() {
private boolean checkCondition(ObservableList<Person> list, Person.Gender gender) {
int males = 0;
int females = 0;
for (Person person : list) {
switch (person.getGender()) {
case MALE: males++; break;
case FEMALE: females++; break;
default: break;
}
}
return ((males > 10 && gender == Person.Gender.MALE) ||
(females > 5 && gender == Person.Gender.FEMALE));
}
@Override
public void onChanged(Change<? extends Person> c) {
while (c.next()) {
if (c.wasAdded()) {
for (Person person : c.getAddedSubList()) {
if (checkCondition((ObservableList<Person>) c.getList(), person.getGender()))
c.getList().remove(person);
}
}
if (c.wasUpdated()) {
for (int update = c.getFrom(); update < c.getTo(); update++) {
Person person = c.getList().get(update);
if (checkCondition((ObservableList<Person>) c.getList(), person.getGender()))
person.setGender(Person.Gender.UNKNOWN);
}
}
}
}
};
people.addListener(listener);
唯一的問題與此解決方案,它並沒有真正「恢復」的更新變化,但設置性別爲新的未知值。
如果你想真正恢復更改,該解決方案可以是這樣的:
this.people = FXCollections.observableArrayList();
ListChangeListener<Person> listener = new ListChangeListener<Person>() {
private boolean checkCondition(ObservableList<Person> list, Person.Gender gender) {
int males = 0;
int females = 0;
for (Person person : list) {
switch (person.getGender()) {
case MALE: males++; break;
case FEMALE: females++; break;
default: break;
}
}
return ((males > 10 && gender == Person.Gender.MALE) ||
(females > 5 && gender == Person.Gender.FEMALE));
}
@Override
public void onChanged(Change<? extends Person> c) {
while (c.next()) {
if (c.wasAdded()) {
for (Person person : c.getAddedSubList()) {
if (checkCondition((ObservableList<Person>) c.getList(), person.getGender()))
c.getList().remove(person);
else
person.genderProperty().addListener((obs, oldval, newval) -> {
if (checkCondition((ObservableList<Person>) c.getList(), newval))
person.setGender(oldval);
});
}
}
}
}
};
people.addListener(listener);
差異:提取已被刪除,因爲ListChangeListener
僅需添加元素的內部是覆蓋。當添加一個新元素時,其genderProperty
上的偵聽器已添加哪一個偵聽性別更新,如果條件不滿足,則生成器將恢復爲原始狀態。
您也可以通過不暴露列表實現相同的功能,但操作列表方法:addPersonAt
,removePersonAt
和updateGenderAt
。
我認爲第二個選項對我來說很好。謝謝! – Jai