Add listener to ArrayList

前端 未结 8 1309
再見小時候
再見小時候 2020-12-09 17:14

I have an ArrayList which I add some Objects to it dynamically, and I have a JButton. The ArrayList is empty when running my program and the JButton is set to setEnabled(fal

相关标签:
8条回答
  • 2020-12-09 17:43

    Following SimpleIntegerProperty syntax I made an ArrayList which fire when the size change. In this case you need to now the current size of the ArrayList since you want to react when the size is 2, so a simple solution to this is doing the following:

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

    In this case the observable is the size of the array, then, when declaring your arraylist, you can add a listener and act when the size is 2.

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

    This implementation also allows you to add a comparison in the ChangeListener so you can know when there was something added or something removed. Also you can store the object added or removed and have it in the listener.

    0 讨论(0)
  • 2020-12-09 17:44
    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 讨论(0)
提交回复
热议问题