Первый слушатель
slider.addChangeListener(e -> spinner.setValue(slider.getValue()));
устанавливает значение счетчика на Integer
- slider.getValue()
, возвращает int
в штучной упаковке, так как spinner.setValue()
требует Object
.
Возможно * вы используете SpinnerNumberModel
, который принимает любые Number
для своих свойств (см. Javadoc). Поскольку значение счетчика было изменено (программно первым слушателем), также вызывается его прослушиватель, что вызывает исключение, поскольку теперь у него есть значение Integer
.
Простой тест, показывающий, что счетчик получает Integer
:
JSlider slider = new JSlider(0, 0, 9, 5);
JSpinner spinner = new JSpinner(new SpinnerNumberModel(5.0, 0.0, 9.0, 1.0));
slider.addChangeListener(e -> spinner.setValue(slider.getValue()));
spinner.addChangeListener(e -> slider.setValue(((Number) spinner.getValue()).intValue()));
JOptionPane.showMessageDialog(null, new Object[] { slider, spinner });
System.out.println(spinner.getValue().getClass());
переместите ползунок и нажмите OK
- он установит значение счетчика в Integer
.
*, пропуская такой минимальный полный рассматриваемый пример
Правильное решение, ИМХО:
slider.addChangeListener(e -> spinner.setValue((double)slider.getValue()));
spinner.addChangeListener(e -> slider.setValue(((Number) spinner.getValue()).intValue()));
Я оставил бросок на Number
, как предложил metallurg , так как модель предназначена для работыс Number
.