Java StackOverflowError - PullRequest
       20

Java StackOverflowError

0 голосов
/ 21 июня 2011
...
float value = Float.parseFloat((String)model.getValueAt(e.getLastRow(), 1));             
DecimalFormat dec = new DecimalFormat("#.###");
model.setValueAt(dec.format(value), e.getLastRow(), 1);
...

в третьей строке я получаю исключение stackOverflowError.Я собираюсь получить значение ячейки JTable из объекта, преобразовать его в число с плавающей точкой, ограничить его 3-мя десятичными разрядами и, наконец, преобразовать в строку и установить значение с 3-мя десятичными знаками в ячейке.

Полагаю, проблема в том, что я меняю значение и снова и снова вхожу в функцию.Таким образом, StackOverflow связан с этим.Вопрос в том, как я могу это исправить?

Полная функция по адресу: Java: преобразование типов данных (Извините за публикацию дважды ... Это был другой вопрос, и решение заставило менядругая проблема)

Ответы [ 4 ]

3 голосов
/ 21 июня 2011

Проблема в том, что setValueAt() будет, в рамках своей реализации, вызывать tableChanged() для всех зарегистрированных слушателей, включая этого.

Чтобы избежать этого, просто проверьте, находится ли значение в ячейке уже в желаемом формате, как первое в вашем методе, и ничего не делайте, если оно есть.

1 голос
/ 21 июня 2011

Я думаю, что эта задача обычно решается путем установки настраиваемого редактора для таблицы.Так что он форматирует все входные данные в желаемой форме.См. этот ответ.

1 голос
/ 21 июня 2011

Только не вызывайте model.setValueAt (), если значение ячейки не изменилось.Это должно остановить рекурсию.

0 голосов
/ 21 июня 2011

Возможно, вам нужно что-то вроде

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);
...