私はいくつかのオブジェクトを動的に追加するArrayListを持っており、JButtonを持っています。プログラムを実行するときにArrayListが空で、JButtonがsetEnabled(false)に設定されています。 ArrayListに2つ以上の要素がある場合はいつでもボタンを有効にし、ArrayListに1つの項目があるか空であればもう一度無効にします。どうすればこれを達成できますか?ArrayListにリスナーを追加します
答えて
ArrayList
には通知メカニズムがありません。
私はArrayList
のプライベートに委任し、通知を聞く機能を追加するか、Java自体の中で似たようなものを見つける機能を追加する独自のList
の実装を提案します。 DefaultListModel
が動作しますが、List
自体は実装されていません。
ArrayListには、@ JonとしてSkeetはArrayListに通知メカニズムがないため、このようなことはできません。 JGoodiesバインドObservableList
を試してみてください。
または、ArrayListのサイズをチェックし、それに応じてJButtonを変更するタイマーを設定することもできます。あなたはある時間間隔で監視リストのこの仕事をするスレッドが必要になります。
または、リストから要素を追加/削除する場所が分かっている場合は、その場所にこのログインを書き込んでください。
@Jon Skeetが示唆するように、List
の実装を書く場合は、EventListenerList
とすることができます。 APIは、関連するメソッドの概要を示します。
@ジョンスキートはあなたも同じような何かを行うことができますとおり:
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(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 -> {
...
});
}
これは素晴らしいです。新しいクラスは必要ありません。 –
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);
}
});
後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または削除されたものまた、追加または削除されたオブジェクトを格納し、それをリスナに格納することもできます。
- 1. オブジェクトプロトタイプにリスナーを追加します
- 2. ArrayListをArrayListに追加する
- 3. arraylistをjavaの2d arraylistに追加します
- 4. leftBarButtonItemにリスナーを追加
- 5. は、ページリフレッシュイベントにリスナーを追加し
- 6. ArrayListに追加する
- 7. arraylistにAndroidを追加
- 8. arraylistにデータを追加
- 9. arraylistにアイコンを追加
- 10. ListViewにリスナーを追加する
- 11. キャンバスポイントにリスナーを追加する
- 12. 数字ピッカーウィジェットにリスナーを追加する
- 13. 条件にリスナーを追加する
- 14. angularjsのモデルにリスナーを追加する
- 15. ログイン前にリスナーを追加する
- 16. リスナーをJPanelに追加する
- 17. エディタグリッドパネルにリスナーを追加する
- 18. ArrayListに要素を追加しない
- 19. リスナーを追加できません
- 20. 2D ArrayList、別のArrayListを追加
- 21. JButtonでArrayListに追加
- 22. ArrayListの問題に追加
- 23. EditTextからArrayListに追加
- 24. ArrayListを追加する<String>をArrayListに追加する<ArrayList <String>>
- 25. は、ArrayListのにクラスのオブジェクトを追加し、それはArrayListの
- 26. Arraylistを保存する前にStringBuilderを追加します。
- 27. クロムカスタムタブにリスナーを追加閉じるボタン
- 28. Angular4でAmchartsにリスナーを追加
- 29. 変更リスナーをマーカーに追加
- 30. 多くのボタンにリスナーを追加リソース
類似:http://stackoverflow.com/questions/16529273/how-to-add-listener-on-arraylist-in-java –