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);
Другие вопросы по тегам