2009-12-21 10 views

Antwort

13

sollten Sie überprüfen Glazed Lists

Es beobachtbaren Liste Klassen enthält, die Brandereignisse, wenn Elemente hinzugefügt, entfernt, ersetzt, etc

+0

Einverstanden. GlazedLists ist ausgezeichnet. – Barend

+0

In der Tat, ein oder zwei der gleichen Leute arbeiteten an ihnen beide ... –

+0

Glazed Lists 'TransformationList erwartet dispose() manuell aufgerufen werden, anstatt WeakReferences für Listeners ....? 0.o Da draußen muss es etwas Besseres geben. – user515655

1

Nun, wenn Sie eine java.util.Collection- oder List-Instanz nicht benötigen, können Sie eine DefaultListModel verwenden. Ich kenne keine "echten" Collection-Implementierungen mit integrierter Listener/Observer-Unterstützung.

+0

Sie die Java-Version 6 von DefaultListModel verbunden, die keine Generika verwendet. Die [Java 7-Version] (http://docs.oracle.com/javase/7/docs/api/javax/swing/DefaultListModel.html) tut das, was Ihren Vorschlag attraktiver machen könnte. –

+0

@MartinRust gut, ja, die Antwort ist von 2 Jahren vor Java 7 kam. Wenn ich es aktualisiere, könnte ich genauso gut Java 8 jetzt –

2

Apache Events.

"Commons-Events bietet zusätzliche Klassen zum Auslösen und Behandeln von Ereignissen. Es konzentriert sich auf das Java Collections Framework und stellt Dekoratoren für andere Sammlungen bereit, die Ereignisse auslösen."

+3

verwenden. Sollte beachtet werden, dass dies noch ein Sandbox-Projekt ist. Ein interessanter jedoch. – BalusC

6

Sie können mit der ForwardingSet, ForwardingList usw. von Guava zu schmücken Sie eine bestimmte Instanz mit dem gewünschten Verhalten.

Hier ist meine eigene Implementierung, die einfach nur JDK-APIs verwendet:

// 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

gibt es diese viele Möglichkeiten zu erreichen - oft ich diesen Ansatz

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; 
       } 
      } 
     } 
    } 

} 
Verwandte Themen