2009-12-21 31 views

Trả lời

13

Bạn nên kiểm tra Glazed Lists

Nó chứa các lớp Danh sách thể quan sát được, mà sự kiện cháy bất cứ khi nào các yếu tố được thêm vào, gỡ bỏ, thay thế, vv

+0

Đồng ý. GlazedLists là tuyệt vời. – Barend

+0

Thật vậy, một hoặc hai người cùng làm việc trên cả hai ... –

+0

Danh sách chuyển đổi 'Danh sách bằng kính mong đợi vứt bỏ() được gọi bằng tay thay vì sử dụng WeakReferences cho người nghe ....? 0.o Phải có cái gì đó tốt hơn ngoài kia. – user515655

1

Vâng, nếu bạn không thực sự cần một phiên bản java.util.Collection hoặc Danh sách, bạn có thể sử dụng một DefaultListModel. Tôi không biết về bất kỳ triển khai Bộ sưu tập "thực" nào có hỗ trợ người nghe/người quan sát tích hợp.

+0

Bạn liên kết phiên bản Java 6 của DefaultListModel, không sử dụng Generics. [Phiên bản Java 7] (http://docs.oracle.com/javase/7/docs/api/javax/swing/DefaultListModel.html) có thể làm cho đề xuất của bạn hấp dẫn hơn. –

+0

@MartinRust tốt, vâng, câu trả lời là từ 2 năm trước khi Java 7 ra mắt. Nếu tôi cập nhật nó, tôi cũng có thể sử dụng Java 8 bây giờ –

2

Apache Events.

"Commons-Events cung cấp các lớp bổ sung để kích hoạt và xử lý sự kiện. Nó tập trung vào Khung công tác Java, cung cấp trang trí cho các bộ sưu tập khác kích hoạt sự kiện".

+3

Cần lưu ý rằng đây vẫn là một dự án sandbox. Một điều thú vị tuy nhiên. – BalusC

6

Bạn có thể sử dụng ForwardingSet, ForwardingList, vv, từ Guava để trang trí một trường hợp cụ thể với hành vi mong muốn.

Dưới đây là thực hiện của riêng tôi mà chỉ sử dụng API JDK đồng bằng:

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

có rất nhiều cách để đạt được điều này - thường tôi sử dụng phương pháp này

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

} 
Các vấn đề liên quan