package bluej.utility.javafx.binding;
import java.util.IdentityHashMap;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import bluej.utility.javafx.JavaFXUtil;
import bluej.utility.javafx.MultiListener;
import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;
| This class is useful when you want to bind one (observable) list to some function of another observable list
| but you need to not only listen to changes in that list, but also further lists inside it.
|
public abstract class DeepListBinding<DEST>{
private final ObservableList<DEST> dest;
private final MultiListener<ObservableList<?>> multiListener;
public DeepListBinding(ObservableList<DEST> dest)
{
this.dest = dest;
final ListChangeListener<Object> listener = c -> update();
this.multiListener = new MultiListener<>(l -> { l.addListener(listener); return () -> l.removeListener(listener);
});
}
public void startListening()
{
update();
}
protected abstract Stream> getListenTargets();
protected abstract Stream calculateValues();
protected void update()
{
multiListener.listenOnlyTo(getListenTargets());
dest.setAll(calculateValues().collect(Collectors.toList()));
}
}
. DeepListBinding
. startListening
. getListenTargets
. calculateValues
. update
48 neLoCode
+ 2 LoComm