DefaultTableModel — удаление строки обновляет вектор, добавление — нет.

Так вот в чем дело. У меня есть JTable в моем фрейме, отображающем некоторые данные, которые можно редактировать. Новые строки могут быть добавлены, старые строки могут быть удалены.

Теперь, если я начну с таблицы, заполненной некоторыми данными, она будет работать нормально. Я могу удалять строки, и это также удаляет строки из моих данных Vector<Vector>. Однако, когда я добавляю строку, она отображается в моей таблице, но изменение не отражается в данных.

Vector<Object> newQuestion = new Vector<Object>(3, 1);
newQuestion.add(question.getText());
newQuestion.add(answer.getText());
newQuestion.add(false);
model.addRow(newQuestion); // Update the model with new question

model это DefaultTableModel. Я попробовал model.fireTableDataChanged();, несмотря на то, что DTM срабатывает сам по себе, однако это тоже не сработало.

Любые указатели?

EDIT: интересно то, что если я начну с некоторых данных в таблице и добавлю строку, изменение также отразится на данных.

РЕДАКТИРОВАНИЕ 2: https://github.com/thekarangoel/YALT/blob/master/src/editDB.java Из строки 65 добавляется строка! Чтобы попробовать, скомпилируйте, запустите, Файл> Добавить новую базу данных. Дайте имя. Добавить новую строку.

EDIT 3: для этого кода: System.out.println("Data: " + data); Вектор> modelData = model.getDataVector(); System.out.println("Данные: " + modelData);

Я получаю это:

Data: null
Data: [[w, a, false]]

Первые данные из моего Vector. Второй — это данные в векторе `model. Почему это происходит? Когда я добавляю что-то в существующую таблицу, строка файла также показывает изменение.


person Karan Goel    schedule 24.03.2013    source источник
comment
Как изменение могло не отражаться в данных? Вы добавляете строку в модель, поэтому у нее есть эта новая строка. Доказательство в том, что таблица отображает это. Что это за код, который вы выполняете и который не делает того, что, по вашему мнению, должен делать? Что вы ожидаете от этого кода и что он делает вместо этого?   -  person JB Nizet    schedule 24.03.2013
comment
Ну, мне нужно добавить строки в пустую таблицу, а затем сохранить данные в файл. Когда я печатаю данные на консоли для отладки, они отображаются как нулевые даже после добавления строк. Если я попытаюсь сохранить таблицу в файл, я получу ошибку NullPointerException. Код сильно зависит от других моих классов, поэтому, к сожалению, я не могу предоставить SSCCE.   -  person Karan Goel    schedule 24.03.2013
comment
Предоставленный вами код работает, так как данные приведены в таблице. Почему бы вам не показать нам код, которого нет? NullPointerException поставляется с трассировкой стека, именем файла и номером строки, поэтому вы сможете легко определить, где находится неработающий код и в чем проблема.   -  person JB Nizet    schedule 24.03.2013
comment
Вы пытались распечатать данные model после добавления строки в JTable через model?   -  person Vishal K    schedule 24.03.2013
comment
@JBNizet Да, исключение возникает, когда я пытаюсь записать данные в файл, поскольку данные пусты. Да, я пытался печатать Vector<Vector> после добавления каждой строки, но это просто ноль.   -  person Karan Goel    schedule 24.03.2013
comment
@VishalK Я не знаю, как напечатать сам model, так как у него нет toString(). Однако да, я пытался печатать вектор‹Вектор› после добавления каждой строки, но он просто нулевой.   -  person Karan Goel    schedule 24.03.2013
comment
К какому классу относится переменная model? DefaultTableModel или ваша собственная переопределенная версия класса DefaultTableModel или что-то еще?   -  person Vishal K    schedule 24.03.2013
comment
@VishalK из моего OP: model это DefaultTableModel.   -  person Karan Goel    schedule 24.03.2013
comment
toString() находится в java.lang.Object. Таким образом, каждый объект имеет один. И если вы не покажете код, мы не сможем помочь. Это так просто. Кажется, вы добавляете данные в модель и пытаетесь сохранить другую модель в файл, но, не видя кода, мы можем только догадываться.   -  person JB Nizet    schedule 24.03.2013
comment
О, подождите, у меня есть это на github. github.com/thekarangoel/YALT/blob/master/src/editDB. java строка #65!   -  person Karan Goel    schedule 24.03.2013
comment
Пожалуйста, смотрите все мои правки. Добавил важную информацию!   -  person Karan Goel    schedule 24.03.2013


Ответы (1)


Посмотрите, как вы создаете данные:

public Vector<Vector<Object>> convertMapToVector(Map<String, String> quesToAnsMap) {
    if (quesToAnsMap.size() > 0) {
        // the data field is initialized here
        data = new Vector<Vector<Object>>(quesToAnsMap.size(), 1); 
        ...
        return data;
    }
    // but not here
    return new Vector<Vector<Object>>();
}

Мои советы, чтобы сделать код более надежным:

  • не используйте поле data. Это бесполезно, так как данные уже содержатся в модели. Итак, чтобы получить данные, вам просто нужно получить их из модели.
  • либо заставьте все ваши методы принимать аргументы и возвращать значения, либо ничего не принимать, возвращать void и инициализировать поля, но смешивание обоих сбивает с толку. Приведенный выше метод инициализирует поле и и возвращает его, но предложение else только возвращает его, не инициализируя.
person JB Nizet    schedule 24.03.2013
comment
Ага.. Хороший улов, сэр! Это исправило это! Мне все еще нужно очистить большую часть моего кода, это всего лишь прототип. Но спасибо за совет. :) - person Karan Goel; 25.03.2013