将侦听器添加到ArrayList

Eng*_*uad 18 java arraylist listener

我有一个ArrayList,我动态地添加了一些对象,我有一个JButton.运行我的程序时,ArrayList为空,JButton设置为setEnabled(false).我想在ArrayList中有2个元素时启用我的按钮,如果ArrayList有一个项目或为空,则再次禁用它.我怎样才能做到这一点?

小智 15

Javafx(JRE 8的一部分)提供了一个可观察的列表实现.这段代码适合我:

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 -> {
   ...
   });
}
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 14

ArrayList 没有任何通知机制.

我建议你编写自己的List实现,委托私有ArrayList存储,但增加了监听通知的能力......或者在Java本身中找到类似的东西.可能对你有用,虽然它没有实现.DefaultListModel List


Tap*_*ose 11

正如@Jon Skeet建议您也可以这样做:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)