将侦听器添加到ArrayList
我有一个ArrayList,我动态地添加了一些对象,我有一个JButton。 运行程序时,ArrayList为空,JButton设置为setEnabled(false)。 我想在ArrayList中有2个元素时启用我的按钮,如果ArrayList有一个项目或为空,则再次禁用它。 我怎样才能做到这一点?
ArrayList
没有任何类型的通知机制。
我建议您编写自己的List
实现,该实现委托给私有ArrayList
进行存储,但增加了监听通知的能力……或者在Java本身中找到类似的东西。 DefaultListModel
可能适合您,虽然它没有实现List
本身。
Javafx(JRE 8的一部分)提供了一个可观察的列表实现。 这段代码适合我:
ObservableList lstAnno1 = FXCollections.observableList(new ArrayList ()); lstAnno1.addListener((ListChangeListener.Change extends MyAnno> c) -> { c.next(); updateAnnotation((List ) c.getAddedSubList(), xyPlot); }); ... lstAnno1.add(new MyAnno(lTs, dValue, strType)); ... public void updateAnnotation(List lstMyAnno, XYPlot xyPlot) { lstMyAnno.forEach(d -> { ... }); }
正如@Jon Skeet建议您也可以这样做:
public class ListResponseModel extends AbstractListModel { private static final long serialVersionUID = 1L; private ArrayList delegate = new ArrayList (); @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); } }
你不能用ArrayList做这件事,因为@Jon Skeet说ArrayList没有任何通知机制。 您应该尝试JGoodies绑定ObservableList
,这可能会有所帮助。
或者您可以设置一个计时器来检查ArrayList的大小并相应地更改JButton。 您将需要一个线程在某个时间间隔执行监视列表的这项工作。
或者,如果您知道从列表中添加/删除元素的所有位置,则在所有位置写入此登录名。
如果你编写自己的List
实现,就像@Jon Skeet建议的那样,你可以给它一个EventListenerList
。 API概述了相关方法。
ObservableList ol = FXCollections.ObservableArrayList(new ArrayList ()); 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); } });
遵循SimpleIntegerProperty语法,我创建了一个ArrayList,当大小发生变化时会触发它。 在这种情况下,您现在需要ArrayList的当前大小,因为您希望在大小为2时做出反应,因此对此的一个简单解决方案是执行以下操作:
ArrayListProperty.java
public class ArrayListProperty extends ArrayList implements ObservableValue { private ExpressionHelper 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); } }
在这种情况下,observable是数组的大小,然后,在声明你的arraylist时,你可以添加一个监听器并在大小为2时动作。
ArrayListProperty
此实现还允许您在ChangeListener中添加比较,以便您可以知道何时添加了某些内容或删除了某些内容。 您还可以存储添加或删除的对象并将其放在侦听器中。
如果您只需要使用java.util.ArrayList解决此问题,则可以使用以下解决方案。 我不知道这是你想要的确切解决方案。 但您可以满足以下需求。
实现添加和删除后应该发生的事情。 根据需要自定义此界面。
public interface ListBehaviorHandler { void afterAdded(); void afterDeleted(); }
并使用以下方法获取自定义行为列表。
public List getCustomList(ListBehaviorHandler listBehaviorHandler) { return new ArrayList () { @Override public boolean add(E e) { boolean added = super.add(e); listBehaviorHandler.afterAdded(); return added; } @Override public void add(int index, E element) { super.add(index, element); listBehaviorHandler.afterAdded(); } @Override public E remove(int index) { E removed = super.remove(index); listBehaviorHandler.afterDeleted(); return removed; } @Override public boolean remove(Object o) { boolean removed = super.remove(o); listBehaviorHandler.afterDeleted(); return removed; } }; }