2011-07-05 15 views
14

में श्रोता जोड़ें मेरे पास एक ऐरेलिस्ट है जिसे मैं गतिशील रूप से कुछ ऑब्जेक्ट्स जोड़ता हूं, और मेरे पास जेबटन है। मेरे प्रोग्राम को चलाते समय ArrayList खाली है और JButton सेट करने के लिए सेट है (झूठा)। जब भी ArrayList में 2 तत्व होते हैं या अधिक होते हैं तो मैं अपने बटन को सक्षम करना चाहता हूं और यदि ArrayList के पास एक आइटम या खाली है तो इसे फिर से अक्षम करें। इसे कैसे प्राप्त किया जा सकता है?ArrayList

+1

समान: http://stackoverflow.com/questions/16529273/how-to-add-listener-on-arraylist-in-java –

उत्तर

11

ArrayList अधिसूचना तंत्र किसी भी प्रकार का नहीं है।

मैं सुझाव है कि आप अपने खुद के List कार्यान्वयन जो एक निजी ArrayList इसके भंडारण के लिए प्रतिनिधियों बारे में है, लेकिन जावा के भीतर ही कुछ इसी तरह करने के लिए नोटिफिकेशन के लिए सुन ... या योग्यता प्रदान करती है। आप के लिए DefaultListModelमई काम है, हालांकि यह List ही लागू नहीं होता है।

3

आप क्योंकि @Jon स्कीट का कहना है के रूप में ArrayList अधिसूचना तंत्र किसी भी प्रकार का नहीं है ArrayList के साथ इस तरह बात नहीं कर सकते। आपको JGoodies को ObservableList बाध्य करने का प्रयास करना चाहिए जो मदद कर सकता है।

या आप एक टाइमर है कि ArrayList के आकार के लिए जाँच करें और JButton तदनुसार बदल जाएगा सेट कर सकते हैं। कुछ समय अंतराल पर आपको निगरानी सूची के इस काम को करने के लिए धागे की आवश्यकता होगी।

या आप सब जगह है जहाँ आप जोड़ने/सूची से तत्वों को दूर तो सब उस जगह पर इस लॉगिन बारे में पता है।

3

यदि आप अपना खुद का List कार्यान्वयन लिखते हैं, जैसे @ जोन स्कीट सुझाव देता है, तो आप इसे EventListenerList दे सकते हैं। एपीआई प्रासंगिक तरीकों की रूपरेखा तैयार करता है।

10

@Jon स्कीट से पता चलता है कि आप भी कुछ ऐसा कर सकते हैं:

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 जो आग जब आकार परिवर्तन किया है। जब से तुम प्रतिक्रिया करने के लिए जब आकार 2 है चाहता हूँ इस मामले में आप अब 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); 
    } 
} 

इस मामले नमूदार सरणी के आकार है, तब, जब आपके ArrayList घोषित करने के लिए, आप एक श्रोता जोड़ सकते हैं और कार्य कर सकते हैं जब आकार 2.

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

इस कार्यान्वयन भी आप ChangeListener में एक तुलना जोड़ने की अनुमति देता है तो आप जान सकते हैं कि कुछ adde कब था डी या कुछ हटा दिया। इसके अलावा आप ऑब्जेक्ट को जोड़ा या हटा सकते हैं और इसे श्रोता में रख सकते हैं।