2011-07-05 11 views
14

私はいくつかのオブジェクトを動的に追加するArrayListを持っており、JButtonを持っています。プログラムを実行するときにArrayListが空で、JButtonがsetEnabled(false)に設定されています。 ArrayListに2つ以上の要素がある場合はいつでもボタンを有効にし、ArrayListに1つの項目があるか空であればもう一度無効にします。どうすればこれを達成できますか?ArrayListにリスナーを追加します

+1

類似:http://stackoverflow.com/questions/16529273/how-to-add-listener-on-arraylist-in-java –

答えて

11

ArrayListには通知メカニズムがありません。

私はArrayListのプライベートに委任し、通知を聞く機能を追加するか、Java自体の中で似たようなものを見つける機能を追加する独自のListの実装を提案します。 DefaultListModelが動作しますが、List自体は実装されていません。

3

ArrayListには、@ JonとしてSkeetはArrayListに通知メカニズムがないため、このようなことはできません。 JGoodiesバインドObservableListを試してみてください。

または、ArrayListのサイズをチェックし、それに応じてJButtonを変更するタイマーを設定することもできます。あなたはある時間間隔で監視リストのこの仕事をするスレッドが必要になります。

または、リストから要素を追加/削除する場所が分かっている場合は、その場所にこのログインを書き込んでください。

3

@Jon Skeetが示唆するように、Listの実装を書く場合は、EventListenerListとすることができます。 APIは、関連するメソッドの概要を示します。

10

@ジョンスキートはあなたも同じような何かを行うことができますとおり:

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(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 -> { 
    ... 
    }); 
} 
+0

これは素晴らしいです。新しいクラスは必要ありません。 –

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

後SimpleIntegerProperty構文は、私がArrayListの火災サイズの変更を行いました。

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

:あなたはサイズがとてもこれに対する簡単な解決策は、次のことをやっている、2のときに反応しますので、この場合は、あなたは、ArrayListのの現在のサイズに必要あなたのArrayListを宣言するときのサイズは、この実装はまた、あなたがのChangeListenerの比較を追加することができます2.

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

あるときに観察この場合は、配列のサイズである、そして、あなたはリスナーを追加し、行動することができますあなたは何かがあった時を知ることができますdまたは削除されたものまた、追加または削除されたオブジェクトを格納し、それをリスナに格納することもできます。

関連する問題