Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка при сохранении содержимого таблицы в файл 
V
    Опции темы
check
Дата 11.11.2006, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 610
Регистрация: 3.4.2006

Репутация: 2
Всего: 23



При попытке сохранить содержимое таблицы(метод saveExpense класса DataManager) получаю ошибку
Код

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 1
    at DataManager.saveExpense(DataManager.java:17)
    at Table$1.actionPerformed(Table.java:60)

Что-то не пойму, почему я выхожу за границы массива?

Table.java
Код

class DataModel extends AbstractTableModel {

    String[] columnNames = {"Дата",
                            "Товар",
                            "Категория",
                            "Цена"};
    String[][] data = {
       {"", "", "", ""}
    };

    public String[] getColumnNames() {
     return columnNames;
    }
    public String[][] getData() {
     return data;
    }
    public int getColumnCount() {
     return data[0].length;
    }
    public int getRowCount() {
     return data.length;
    }
    public Object getValueAt(int row, int col) {
     return data[row][col];
    }

}

public class Table extends JFrame {

    Table() {
    Container cp = getContentPane();
    setSize(500,300);
    final DataModel dm = new DataModel();
    String[][] data = dm.getData();
    String[] columnNames = dm.getColumnNames();
    JPanel base = new JPanel(new GridLayout(2,1));
    JPanel top = new JPanel();
    JPanel bottom = new JPanel();
    JTable table = new JTable(data, columnNames);
    table.setPreferredScrollableViewportSize(new Dimension(500, 70));
    top.add(new JScrollPane(table));
    JButton sendButton = new JButton("Ok");
    bottom.add(sendButton);
    base.add(top);
    base.add(bottom);
    cp.add(base);
    setVisible(true);

    sendButton.addActionListener(new ActionListener(){
      public void actionPerformed(ActionEvent e) {
          DataManager Manager = new DataManager();
          Manager.saveExpense(dm.getData(), dm.getColumnCount(), dm.getRowCount()); 
      }
    });
    }


   public static void main(String[] args) {
        new Table();
   }
}



DataManager.java
Код

public class DataManager {

    File expensesFile;

    DataManager() {
        expensesFile = new File("expenses.dat");
    }

    public void saveExpense(String[][] data, int columnCount, int rowCount) {
        try
        {
            PrintWriter outExpenses = new PrintWriter(new BufferedWriter(new FileWriter(expensesFile)));
            for (int i=0; i < columnCount; i++) {
                for (int j=0; j < rowCount; j++)
                    outExpenses.println(data[i][j]);
            }
            outExpenses.close();
        }
        catch(IOException ex) {};
    }
}

PM MAIL   Вверх
LSD
Дата 11.11.2006, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Ошибка тут:
Код
for (int i=0; i < columnCount; i++) {
  for (int j=0; j < rowCount; j++)
    outExpenses.println(data[i][j]);
}

первый индекс это строки, а второй это колонки, ты же делаешь наоборот.
Код
for (int i=0; i < rowCount; i++) {
  for (int j=0; j < columnCount; j++)
    outExpenses.println(data[i][j]);
}



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
check
Дата 11.11.2006, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 610
Регистрация: 3.4.2006

Репутация: 2
Всего: 23



Спасибо, теперь в файл записывается.
Но не всё, куда-то теряется содержимое последней ячейки.
У меня в таблице одна строка и четыре колонки, следовательно
последняя ячейка это data[0][3].
Пытаюсь продебаггить проблемный участок кода
Код

for (int i=0; i < rowCount; i++) {
   for (int j=0; j < columnCount; j++) {
       System.out.println(j); //тут всё правильно выводит
       if (j == 3) //если последняя ячейка - смотрим её содержимое
       System.out.println(data[i][j]); //и ничего не видим
       outExpenses.println(data[i][j]);
   }
}  

Выдает следущее
Код

0
1
2
3

Строка которая введена в последнюю ячейку таблицы не выводится.
Можно ещё так проверить
Код

System.out.println(data[0][3]);

тот же результат - пустота.
То есть размер массива соответствует размеру таблицы,
но в последнем элементе массива ничего нет.
PM MAIL   Вверх
LSD
Дата 11.11.2006, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Код
System.out.println("data[" + i + "][" + j + "] = " + data[0][3]);



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
check
Дата 11.11.2006, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 610
Регистрация: 3.4.2006

Репутация: 2
Всего: 23



Цитата(LSD @  11.11.2006,  18:25 Найти цитируемый пост)
System.out.println("data[" + i + "][" + j + "] = " + data[0][3]);

А хоть и так
Код

data[0][0] = 
data[0][1] = 
data[0][2] = 
data[0][3] = 


PM MAIL   Вверх
check
Дата 11.11.2006, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 610
Регистрация: 3.4.2006

Репутация: 2
Всего: 23



Я этот код писал в Idea. Это так, на всякий случай, в принципе какая разница 
где я его пишу.
Я попробовал по другому объявить массив data, без инициализации пустыми строками.
Код

    String[] columnNames;
    String[][] data;

    DataModel() {
    columnNames = new String[]{"Дата",
             "Товар",
             "Категория",
             "Цена"};
   
    data = new String[1][4];
    }


Теперь System.out.println("data[" + i + "][" + j + "] = " + data[i][j]); в цикле
выдает следующее(в ячейки таблицы я вводил цифры от 1 до 4)

Код

data[0][0] = 1
data[0][1] = 2
data[0][2] = 3
data[0][3] = null


Если же проинициализировать массив при объявлении какими то значениями
Код

String[][] data = {
                   {"val1", "val2", "val3", "val4"} 
                  };


То всё выводится и пишется в файл правильно, если ячейки не редактировать.
Если же их отредактировать, то опять та же петрушка
Код

data[0][0] = newval1
data[0][1] = newval2
data[0][2] = newval3
data[0][3] = val4

Последний элемент массива сохраняет первоначальное значение, что бы я не делал.  Может Idea глючит?


PM MAIL   Вверх
check
Дата 12.11.2006, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 610
Регистрация: 3.4.2006

Репутация: 2
Всего: 23



Цитата(check @  11.11.2006,  21:18 Найти цитируемый пост)
Может Idea глючит?

Idea конечно не причем. Перекомпилил и запустил программу на голом JDK - всё так же.

PM MAIL   Вверх
check
Дата 17.11.2006, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 610
Регистрация: 3.4.2006

Репутация: 2
Всего: 23



Да, и такое бывает...
Я несколько раз переписал этот код заново, потом сходил в магазин
и купил книгу И.Портянкина "Swing: эффектные пользовательские интерфейсы",  но не помогло и это. И только сейчас до меня дошло: после ввода текста в последнюю ячейку нужно нажать Enter!  smile 
Однако меня всерьёз обеспокоила судьба потенциального юзера моей программы, а что если он тоже не догадается?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0530 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.