2015-10-09 7 views
-1

Это действительно сбивает с толку. У меня есть набор из JSpinner компонентов в моем приложении, и все они работают нормально. У меня есть их модели, которые должны быть рядом целочисленных значений. Они объявлены следующим образом:JSpinner возвращает неправильный тип

spinner1 = new javax.swing.JSpinner(); 
spinner1.setModel(new javax.swing.SpinnerNumberModel(10, 0, 10, 1)); 

Когда мне нужно их значения в коде, я позвоню getValue() который возвращает объект, и я бросил его как целое, как так:

int importantVal = (Integer)spinner1.getValue(); 

И это работает отлично. По какой-то причине я сделал новый JSpinner, с точно такой же SpinnerNumberModel, но я получаю сообщение об ошибке:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: 
    java.lang.Float cannot be cast to java.lang.Integer 

Это дает мне обратно поплавок по какой-то причине. Я подтвердил, что модель такая же, я попытался скопировать и вставить рабочий JSpinner в эту новую роль и совместить имя, но у меня все еще такая же проблема. Из любопытства я попытался изменить строку, где у меня есть эта ошибка, чтобы вместо нее использовать ее как Float, а затем я получаю обратную ошибку: она возвращает Integer, и теперь я пытаюсь использовать ее как float.

Зачем ему это делать, и как он мог возвратить поплавок? Я даже попытался установить модель, используя new SpinnerNumberModel(new Integer(10), new Integer(0), new Integer(10), new Integer(1)), но, естественно, это ничего не меняет ...

+4

Это может быть натяжкой, но рассмотреть возможность предоставления [работоспособный пример] (https://stackoverflow.com/help/mcve), который демонстрирует проблему, если это возможно, показывая как рабочий кок и ваш непослушный вертушка. Это не дамп кода, а пример того, что вы делаете, что подчеркивает проблему, с которой вы сталкиваетесь. Это приведет к меньшему путанице и лучшим ответам. – MadProgrammer

+1

Мне нравится, когда вы производите шаг за шагом, используя модель для создания счетчика и запроса значения. Здесь может быть лучше. Если нет, отправьте сообщение [mcve] по рекомендации @MadProgrammer - поскольку для определения непосредственной проблемы недостаточно кода. –

ответ

1

Как указывали люди, я не размещал достаточно, чтобы определить проблему. Не было ничего плохого в том, как я объявлял свой JSpinner, поэтому они нормально работали. Это было ошибкой в ​​другом месте этого непослушного приложения, которое вызвало проблему:

У меня была функция, которая случайно установила значение JSpinner с поплавком, и именно поэтому он возвращал поплавок. Я этого не понимал, но SpinnerNumberModel со значением/min/max/step size, объявленным как int, может быть присвоено значение float. И он будет иметь размер min/max/step как int, но значение будет float.

Упс

+0

Хороший улов. Это полезно знать и полностью понять, как вы попали в эту ловушку. Оглядываясь назад, очевидно, что модель использует Number в качестве своего типа значений и, следовательно, совершенно неоднозначна в отношении конкретного типа номера во время выполнения, но на самом деле это не очень интуитивно понятно. – ohlec

Смежные вопросы