2011-07-05 31 views
14

Tôi có một ArrayList mà tôi thêm một số đối tượng vào nó động, và tôi có một JButton. ArrayList trống khi chạy chương trình của tôi và JButton được đặt thành setEnabled (false). Tôi muốn kích hoạt nút của tôi bất cứ khi nào có 2 yếu tố trong ArrayList hoặc nhiều hơn và vô hiệu hóa nó một lần nữa nếu ArrayList có một mục hoặc trống. Làm thế nào tôi có thể đạt được điều này?Thêm người nghe vào ArrayList

+1

Tương tự: http://stackoverflow.com/questions/16529273/how-to-add-listener-on-arraylist-in-java –

Trả lời

11

ArrayList không có bất kỳ loại cơ chế thông báo nào.

Tôi đề nghị bạn viết List thực hiện riêng của mình để ủy quyền cho một lưu trữ riêng ArrayList, nhưng thêm khả năng nghe thông báo ... hoặc tìm nội dung tương tự trong Java. DefaultListModelcó thể phù hợp với bạn, mặc dù nó không tự thực hiện List.

3

Bạn không thể làm điều đó với ArrayList vì như @Jon Skeet nói ArrayList không có bất kỳ loại cơ chế thông báo nào. Bạn nên thử JGoodies ràng buộc ObservableList có thể hữu ích.

Hoặc bạn có thể thiết lập bộ hẹn giờ sẽ kiểm tra kích thước của ArrayList và thay đổi JButton cho phù hợp. Bạn sẽ yêu cầu một chuỗi để thực hiện công việc này của danh sách theo dõi tại một khoảng thời gian nào đó.

Hoặc nếu bạn biết tất cả những nơi bạn thêm/xóa các phần tử khỏi danh sách thì hãy viết thông tin đăng nhập này tại tất cả địa điểm đó.

3

Nếu bạn viết thực hiện List của riêng mình, như @Jon Skeet đề xuất, bạn có thể cung cấp cho nó EventListenerList. API phác thảo các phương pháp có liên quan.

10

Như @ Jon Skeet gợi ý bạn cũng có thể làm điều gì đó như:

public class ListResponseModel<E> extends AbstractListModel { 

    private static final long serialVersionUID = 1L; 

    private ArrayList<E> delegate = new ArrayList<E>(); 

    @Override 
    public int getSize() { 
     return delegate.size(); 
    } 

    @Override 
    public Object getElementAt(int index) { 
     return delegate.get(index); 
    } 

    public void add(E e){ 
     int index = delegate.size(); 
     delegate.add(e); 
     fireIntervalAdded(this, index, index); 
    } 
} 
10

JavaFX (một phần của JRE 8) cung cấp một danh sách thực hiện quan sát được. Mã này làm việc cho tôi:

ObservableList<MyAnno> lstAnno1 = FXCollections.observableList(new ArrayList<MyAnno>()); 

lstAnno1.addListener((ListChangeListener.Change<? extends MyAnno> c) -> { 
    c.next(); 
    updateAnnotation((List<MyAnno>) c.getAddedSubList(), xyPlot); 
}); 

... 
lstAnno1.add(new MyAnno(lTs, dValue, strType)); 
... 

public void updateAnnotation(List<MyAnno> lstMyAnno, XYPlot xyPlot) { 
    lstMyAnno.forEach(d -> { 
    ... 
    }); 
} 
+0

Điều này thật tuyệt. Không cần lớp mới. –

2
ObservableList<DynamicObjects> ol = FXCollections.ObservableArrayList(new ArrayList<DynamicObjects>()); 
ListProperty lp = new SimplePropertyList(ol); 

lp.addListener(new ChangeListener(){ 
     @Override public void changed(ObservableValue o, Object oldVal, 
             Object newVal){ 
      if (ol.size() > 1 && !JButton.isEnabled()) { 
       JButton.setEnable(true); 
      } else if (ol.size < 2 && JButton.isEnabled()) { 
       JButton.setEnable(false); 
      } 
    }); 
0

Tiếp theo cú pháp SimpleIntegerProperty tôi đã thực hiện một ArrayList mà lửa khi thay đổi kích thước. Trong trường hợp này bạn cần bây giờ là kích thước hiện tại của ArrayList kể từ khi bạn muốn phản ứng khi kích thước là 2, do đó, một giải pháp đơn giản để điều này được làm như sau:

ArrayListProperty.java

public class ArrayListProperty<E> extends ArrayList<E> implements ObservableValue<Number> { 
    private ExpressionHelper<Number> helper = null; 
    private SimpleIntegerProperty sizeProperty; 

    public ArrayListProperty(){ 
     super(); 
     sizeProperty = new SimpleIntegerProperty(0); 
    } 

    @Override 
    public boolean add(E e) { 
     boolean returnValue = super.add(e); 
     sizeProperty.set(size()); 
     fireValueChangedEvent(); 
     return returnValue; 
    } 

    @Override 
    public void add(int index, E element) { 
     super.add(index, element); 
     sizeProperty.set(size()); 
     fireValueChangedEvent(); 
    } 

    @Override 
    public E remove(int index) { 
     E returnValue = super.remove(index); 
     sizeProperty.set(size()); 
     fireValueChangedEvent(); 
     return returnValue; 
    } 

    @Override 
    public boolean remove(Object o) { 
     boolean returnValue = super.remove(o); 
     if(returnValue){ 
      sizeProperty.set(size()); 
      fireValueChangedEvent(); 
     } 
     return returnValue; 
    } 

    protected void fireValueChangedEvent(){ 
     ExpressionHelper.fireValueChangedEvent(helper); 
    } 

    @Override 
    public void addListener(ChangeListener<? super Number> listener) { 
     helper = ExpressionHelper.addListener(helper, sizeProperty, listener); 
    } 

    @Override 
    public void removeListener(ChangeListener<? super Number> listener) { 
     helper = ExpressionHelper.removeListener(helper, listener); 
    } 

    @Override 
    public Number getValue() { 
     return null; 
    } 

    @Override 
    public void addListener(InvalidationListener listener) { 
     helper = ExpressionHelper.addListener(helper, sizeProperty, listener); 
    } 

    @Override 
    public void removeListener(InvalidationListener listener) { 
     helper = ExpressionHelper.removeListener(helper, listener); 
    } 
} 

trong trường hợp này quan sát được là kích thước của mảng, sau đó, khi tuyên bố ArrayList, bạn có thể thêm một người biết lắng nghe và hành động khi kích thước là 2.

ArrayListProperty<Object> arrayList = new ArrayListProperty<>(); 
arrayList.addListener((ob, ov, nv) -> { 
    if(nv.intValue() == 2) doSomething(); 
}); 

thực hiện này cũng cho phép bạn thêm một sự so sánh trong ChangeListener để bạn có thể biết khi nào có thứ gì đó d hoặc một cái gì đó loại bỏ. Ngoài ra, bạn có thể lưu trữ các đối tượng được thêm vào hoặc loại bỏ và có nó trong người nghe.

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