In alcuni contesti è necessario rilevare - in un ListChangeListener, senza controllo sulla lista stessa - un "tutti i dati scambiati", f.i. quando abbiamo bisogno di cancellare alcuni stati come la selezione - su dati completamente nuovi il vecchio stato non ha senso.ObservableList: come rilevare in modo affidabile un setAll?
completamente nuovi dati possono essere raggiunte in
- list.setAll (...)
- list.set (otherObservableList) se la lista è un ListProperty
Pensando a quale tipo di le modifiche possono essere attivate su setAll (c è la modifica, gli articoli sono la lista osservata, lo pseudo-codice "subChangeCount" per il conteggio dei sottocanali):
// 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());
Questo sembra permettere un controllo utilità come:
boolean wasSetOrClearedAll(Change c) {
if (c.getList().isEmpty()) return true;
c.next();
if (c.getAddedSize() == c.getList().size()) return true;
return false;
}
Al contrario, codice fx interna, F.I. in ascolto di voci ComboBox':
while (c.next()) {
comboBox.wasSetAllCalled = comboBox.previousItemCount == c.getRemovedSize();
...
}
comboBox.previousItemCount = getItemCount();
negozi del vecchio ItemCount e confrontare quella contro il removedSize corrente (che sono a disagio con, vecchio stato diventa stantio troppo spesso per i miei gusti), tuttavia, c'è una buona probabilità che mi manca qualcosa con il mio approccio.
domanda è:
in quale contesto sarebbe il mio metodo di utilità fallire (e l'approccio di base rileverebbe SETALL correttamente)?
Qual è il tipo concreto di ObservableList che si sta utilizzando? Sembra che ListProperty sia una classe astratta che non dichiara setAll (...) – Zeki
@zeki hmm .. tutte le ObservableList devono avere un setAll (T ... item) - può essere non supportato, ovviamente, quindi prendi quello che ha implementato (ListProperty non è niente di speciale, semplicemente instrada il setAll del suo backing list) – kleopatra
In tal caso, potresti estendere ListProperty e impostare SetAll per attivare un evento prima di chiamare il metodo super? – Zeki