Creating a Custom Spinner Model

I am trying to create a custom JSpinner that represents a sequence of numbers of power 2. For example, 1-2-4-8-16 and so on. I have to do this with the AbstractSpinnerModel extension and changing implemented methods (getNextValue, etc.). The problem is that the arrow keys on my regular JSpinner do not work. Nothing changes when I click one of them. I need to show the previous and next values ​​of the current value. (Previous value = 4 Current value = 8 Next value = 16).

Here is my code:

import java.awt.*;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class Hw5SpinnerModel extends JFrame {

public static void main(String[] args) {

    Hw5SpinnerModel frame = new Hw5SpinnerModel();

}

public Hw5SpinnerModel() {

    setTitle("Hw5SpinnerModel");
    setSize(350, 300);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    final JSpinner jspn = new JSpinner(new CustomSpinnerModel());

    final JLabel jlbl = new JLabel("");

    add(jspn, BorderLayout.NORTH);
    add(jlbl, BorderLayout.CENTER);

    jspn.addChangeListener(new ChangeListener() {

        @Override
        public void stateChanged(ChangeEvent e) {

            jlbl.setText(jspn.getPreviousValue() + jspn.getValue() + jspn.getNextValue());

        }

    });

    //jlbl.setText(jspn.getNextValue() + "");

    setVisible(true);

}

public class CustomSpinnerModel extends AbstractSpinnerModel {

    Integer i = 1;

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

    @Override
    public void setValue(Object value) {
        i = (Integer) value;
    }

    @Override
    public Object getNextValue() {
        return 2 * i;
    }

    @Override
    public Object getPreviousValue() {
        return i / 2;
    }

}

}

Any help would be appreciated.

+4
source share
1 answer
    jSpinner1.setModel(new SpinnerNumberModel(1, null, null, 1) {
        @Override
        public Object getNextValue() {                
            Object nextValue = super.getValue();
            int x = Integer.valueOf(nextValue.toString())*2;
            //Object o = x;
            return x;
        }
    });

It works 100%

+3

Source: https://habr.com/ru/post/1569228/


All Articles