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
Trả lời
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. DefaultListModel
có thể phù hợp với bạn, mặc dù nó không tự thực hiện List
.
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 đó.
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.
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);
}
}
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 -> {
...
});
}
Điều này thật tuyệt. Không cần lớp mới. –
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);
}
});
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.
- 1. cách thêm người nghe vào autocompletetextview, android?
- 2. thêm người nghe vs người nghe đã đặt
- 3. Thêm vào một ArrayList Java
- 4. Thêm người nghe sự kiện vào nhiều yếu tố
- 5. Tự động thêm người nghe vào Google Maps Markers
- 6. giá trị Thêm vào ArrayList
- 7. EXT JS - thêm người nghe vào bất kỳ phần tử nào được thêm vào vùng chứa
- 8. Java NullPointerException khi thêm vào ArrayList?
- 9. Jquery thêm người nghe sự kiện vào các yếu tố được thêm động
- 10. Làm thế nào để thêm người nghe sự kiện vào một mảng của các đối tượng
- 11. Thêm một người nghe vào một biến trong Java/JavaFX được gọi là thay đổi biến
- 12. Thêm giá trị vào ArrayList sử dụng JSTL
- 13. Nghe hàng bảng thêm
- 14. Trình nghe "SoftDeleteableListener" chưa được thêm vào EventManager
- 15. cách đính kèm một người nghe vào nút radio
- 16. ArrayList tự động thêm các mục null
- 17. Cách thêm trình nghe hành động nghe nhiều nút
- 18. ExtJS loại bỏ người nghe
- 19. Gán ArrayList vào danh sách
- 20. Hiệu quả của việc thêm người nghe vào bộ lớp jQuery, so với việc sử dụng $ .each
- 21. Thêm phần tử trong hai ArrayList chiều
- 22. Thêm người gửi hành động vào jpanel
- 23. cách thêm góc $ http kiện nghe
- 24. Làm cách nào để thêm trình nghe nhấp đúp vào trình soạn thảo GEF của tôi?
- 25. Người nghe MSMQ sử dụng WCF
- 26. Người nghe để nhấn và nhả nút
- 27. người nghe để xóa thẻ sd
- 28. ViewPager OnLongClick người nghe không bắn
- 29. Người nghe sự kiện trong Java
- 30. Các cuộc gọi addEventListener trùng lặp có tạo các mục nghe người nghe trùng lặp không?
Tương tự: http://stackoverflow.com/questions/16529273/how-to-add-listener-on-arraylist-in-java –