2009-12-21 10 views

Respuesta

13

Debe retirar Glazed Lists

Contiene clases Lista observables, que los incendios cuando se añadan elementos, extrae, se sustituye, etc

+0

De acuerdo. GlazedLists es excelente. – Barend

+0

De hecho, una o dos de las mismas personas trabajaron en ellas ... –

+0

TransformationList de Glazed Lists espera invocar dispose() en lugar de usar WeakReferences para oyentes ...? 0.o Tiene que haber algo mejor por ahí. – user515655

1

Bueno, si realmente no necesita una instancia java.util.Collection o List, puede usar un DefaultListModel. No conozco ninguna implementación de Colección "real" con compatibilidad incorporada de escucha/observador.

+0

se enlazó la versión Java 6 de DefaultListModel, que no usa genéricos La [versión de Java 7] (http://docs.oracle.com/javase/7/docs/api/javax/swing/DefaultListModel.html) lo hace, lo que puede hacer que su sugerencia sea más atractiva. –

+0

@MartinRust Bueno, sí, la respuesta es de 2 años antes de que saliera Java 7. Si voy a actualizarlo, también podría usar Java 8 ahora –

2

Apache Events.

"Commons-Events proporciona clases adicionales para disparar y manejar eventos. Se centra en el Java Collections Framework, que proporciona decoradores a otras colecciones que disparan eventos".

+3

Debe tenerse en cuenta que este sigue siendo un proyecto de recinto de seguridad. Sin embargo, es interesante. – BalusC

6

Puede usar el ForwardingSet, ForwardingList, etc., de Guava a decorar una instancia particular con el comportamiento deseado.

Aquí es mi propia aplicación que sólo utiliza las API de JDK de civil:

// create an abstract class that implements this interface with blank implementations 
// that way, annonymous subclasses can observe only the events they care about 
public interface CollectionObserver<E> { 

    public void beforeAdd(E o); 

    public void afterAdd(E o); 

    // other events to be observed ... 

} 

// this method would go in a utility class 
public static <E> Collection<E> observedCollection(
    final Collection<E> collection, final CollectionObserver<E> observer) { 
     return new Collection<E>() { 
      public boolean add(final E o) { 
       observer.beforeAdd(o); 
       boolean result = collection.add(o); 
       observer.afterAdd(o); 
       return result; 
      } 

      // ... generate rest of delegate methods in Eclipse 

    }; 
    } 
0

hay muchas maneras de lograr esto - a menudo i utilizar este enfoque

import java.lang.ref.WeakReference; 
import java.util.ArrayList; 
import java.util.Collection; 
import java.util.List; 

public class ObservableArrayList<E> extends ArrayList<E> { 

    private @interface MethodId { 
     private static final int REMOVE = 2; 
     private static final int ADD = 1; 
    } 

    public interface ListObserver<E> { 
     void onElementAdded(E element); 
     void onElementRemoved(E element); 
    } 

    public ObservableArrayList(int capacity) { 
     super(capacity); 
     ensureObserver(); 
    } 

    public ObservableArrayList() { 
     ensureObserver(); 
    } 

    public ObservableArrayList(Collection<? extends E> collection) { 
     super(collection); 
     ensureObserver(); 
    } 

    private List<WeakReference<ListObserver<E>>> _listObserverWeakRefList; 

    public void addObserver(ListObserver<E> observer) { 
     _listObserverWeakRefList.add(new WeakReference<ListObserver<E>> (observer)); 
    } 

    private void ensureObserver() { 
     if (_listObserverWeakRefList == null) { 
      _listObserverWeakRefList = new ArrayList<>(); 
     } 
    } 

    @Override 
    public boolean add(E object) { 
     super.add(object); 
     callObservable(MethodId.ADD, object); 
     return true; 
    } 

    @Override 
    public boolean remove(Object object) { 
     boolean removed = super.remove(object); 
     if (removed) callObservable(MethodId.REMOVE, object); 
     return removed; 
    } 

    private void callObservable(@MethodId int methodId, Object element) { 
     for (WeakReference<ListObserver<E>> observerRef : _listObserverWeakRefList) { 
      ListObserver<E> observer = observerRef.get(); 
      if (observer != null) { 
       switch (methodId) { 
        case MethodId.ADD: 
         observer.onElementAdded((E) element); 
         break; 
        case MethodId.REMOVE: 
         observer.onElementRemoved((E) element); 
         break; 
       } 
      } 
     } 
    } 

} 
Cuestiones relacionadas