Java StackruError
...
float value = Float.parseFloat((String)model.getValueAt(e.getLastRow(), 1));
DecimalFormat dec = new DecimalFormat("#.###");
model.setValueAt(dec.format(value), e.getLastRow(), 1);
...
в третьей строке я получаю исключение stackOverflowError. Я собираюсь получить значение ячейки JTable из Object, преобразовать его в число с плавающей точкой, ограничить его 3-мя десятичными разрядами и, наконец, преобразовать в String и установить значение с 3-мя десятичными знаками в ячейке.
Я думаю, проблема в том, что я меняю значение и снова и снова вхожу в функцию. Так что Stackru связан с этим. Вопрос в том, как я могу это исправить?
Полная функция по адресу: Java: преобразование типов данных(извините за публикацию дважды... Это был другой вопрос, и решение привело меня к другой проблеме)
4 ответа
Проблема в том, что setValueAt()
будет, как часть его реализации вызова tableChanged()
на всех зарегистрированных слушателей, включая этого.
Чтобы избежать этого, просто проверьте, находится ли значение в ячейке уже в желаемом формате, как первое в вашем методе, и ничего не делайте, если оно есть.
Я думаю, что эта задача обычно выполняется путем установки специального редактора для таблицы. Так что он форматирует все входные данные в желаемой форме. Смотрите этот ответ.
Просто не вызывайте model.setValueAt(), если значение ячейки не изменилось. Это должно остановить рекурсию.
Возможно, вам нужно что-то вроде
String text = (String) model.getValueAt(e.getLastRow(), 1);
String text2 = new DecimalFormat("#.###").format(Float.parseFloat(text));
if (!text.equals(text2))
model.setValueAt(dec.format(value), e.getLastRow(), 1);