Search code examples
javaswingjspinnerchangelistener

Custom JSpinner Model not working


I tried to implement my own JSpinner model to accept an enumeration (including I18N), so I did like that:

searchSpinner.setModel(new AbstractSpinnerModel() {

    int index = 0;
    int minIndex = 0;
    int maxIndex = MY_ENUM.values().length - 1;
    Object selected = MY_ENUM.values()[index];

    @Override
    public Object getValue() {
        return selected;
    }

    @Override
    public void setValue(Object value) {
        selected = value;
        fireStateChanged();
    }

    @Override
    public Object getNextValue() {
        if (index < maxIndex) {
            index++;
        }
        fireStateChanged();
        return MY_ENUM.values()[index];
    }

    @Override
    public Object getPreviousValue() {
        if (index > minIndex) {
            index--;
        }
        fireStateChanged();
        return MY_ENUM.values()[index];
    }

    @Override
    public void addChangeListener(ChangeListener l) {

    }

    @Override
    public void removeChangeListener(ChangeListener l) {

    }
});

The problem is that did not work, and even the spinner list looks like disabled. What am I doing wrong?

UPDATE: Based on first answer


Solution

  • You should use ChangeListener to notify the view of changes in the model.

    spinner = new JSpinner(new SpinnerModel() {
        private ChangeListener l;
    
        @Override
        public void setValue(Object value) {
            ...
    
            if(l != null) {
                l.stateChanged(new ChangeEvent(this));
            }
        }
    
        ...
    
        @Override
        public void addChangeListener(ChangeListener l) {
            this.l = l;
        }
    
        @Override
        public void removeChangeListener(ChangeListener l) {
            if(this.l == l) {
                this.l = null;
            }
        }
    });
    

    Edit: You can use List to register many listeners.