2014-11-18 16 views
18

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)?

+0

Qual è il tipo concreto di ObservableList che si sta utilizzando? Sembra che ListProperty sia una classe astratta che non dichiara setAll (...) – Zeki

+0

@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

+0

In tal caso, potresti estendere ListProperty e impostare SetAll per attivare un evento prima di chiamare il metodo super? – Zeki

risposta

4

Sfortunatamente non esiste un modo affidabile per rilevare questo lato di Listener.

La lotta inizia con la L'implementazione di default, che appare per lo più come questo:

@Override 
public boolean setAll(Collection<? extends E> col) { 
    beginChange(); 
    try { 
     clear(); 
     addAll(col); 
    } finally { 
     endChange(); 
    } 
    return true; 
} 

Se si passa un insieme vuoto per setAll il risultato e l'evento che viene generato sono sia esattamente la stessa di quando si farebbe Ho chiamato clear.

Quindi il metodo wasSetOrClearedAll restituisce true quando è stato chiamato anche clear (così come l'implementazione principale).

Quindi, alla fine non esiste un rilevamento generico di setAll, tutto dipende dal vostro caso d'uso. Se riesci a restringere ciò che stai cercando di rilevare, puoi scrivere un filtro per questo.

+0

ahhh ... non ha nemmeno pensato di esaminare l'implementazione di base ;-) Buona discussione, grazie! clear/setTutto essere lo stesso è abbastanza buono - fondamentalmente ho bisogno di alcuni mezzi per gettare in modo affidabile tutto lo stato relativo a vecchi articoli (senza avere riferimenti agli articoli, solo per le loro posizioni precedenti). hmm ... torna a pensare – kleopatra

+0

E ListChangeListener.Change.getRemoved()/getFrom()/getTo() non è abbastanza buono per la pulizia? – eckig

+0

hmm .. non se seguo le implementazioni core di selectionModels. Che sono buggy come l'inferno, però. Probabilmente hai bisogno di pensare da zero, forse setAll non è un caso così speciale, dopotutto :-) – kleopatra

Problemi correlati