Невозможно добавить строку в мой JTable с отображением AbstractTableModel в базу данных - PullRequest
2 голосов
/ 14 апреля 2020

У меня есть объект JPA, который я пытаюсь сохранить в базе данных Derby и отображаю эту базу данных для пользователя.

В настоящее время я могу это сделать. Однако я хотел бы обновить базу данных для пользователя, как только она будет добавлена ​​в базу данных, как в настоящее время. Программа должна выйти, а затем снова запуститься, чтобы показать пользователю обновленную таблицу JTable.

I Я использую AbstractTableModel для сопоставления моей таблицы базы данных с JTable в представлении .

. Я считаю, что проблема лежит где-то в setValueAt () в моем abstractTableModel, но я действительно не знаю.

Вот мой AbstractTableModel:

public class DBModel extends AbstractTableModel {
    private Model SearchModel;
    private List<FileDoc> results;
    enum Col {ID, NAME, EXISTENCE, MODIFIED}

    public DBModel(){
    SearchModel = new Model();
    List<FileDoc> results = SearchModel.getFile();
    this.results = results;
    }

@Override
public int getColumnCount(){return Col.values().length;}
@Override
public int getRowCount(){return results.size();}
@Override
public Object getValueAt(int row,int col){
    Col column = Col.values()[col];
    FileDoc filedoc = results.get(row);
    switch(column) {
        case ID:        return filedoc.getFileID();
        case NAME:      return filedoc.getFileName();
        case EXISTENCE: return filedoc.isExistence();
        case MODIFIED:  return filedoc.getModified();
    }
return FileDoc.class;
}
@Override
public String getColumnName(int col){
    Col column = Col.values()[col];
    return column.toString();
}

public void addRow(FileDoc filedoc) {
    results.add(filedoc);
    fireTableRowsInserted(results.size()-1, results.size()-1);
    fireTableDataChanged();
}

@Override
public void setValueAt(Object value, int row, int col){
    Col column = Col.values()[col];
    FileDoc filedoc = results.get(row);
    switch(column) {
        case ID:        filedoc.setFileID((Integer)value);
        case NAME:      filedoc.setFileName((String)value);
        case EXISTENCE: filedoc.setExistence((Boolean)value);
        case MODIFIED:  filedoc.setModified((Date)value);
    }
    fireTableCellUpdated(row,col);
}}

и т. Д. Это модель, которая отображает базу данных в Jtable. Вроде. Я имею в виду, что он берет в resultList прав доступа fileDo c и добавляет объект в resultList.

Вы можете увидеть, как я вызываю JTable в Представлении .

Когда пользователь нажимает кнопку добавления в представлении, он отправляет их обработчику событий в Контроллере (строка 55)

Затем в Модель Я вызываю метод addRow из AbstractTableModel. Я знаю, что метод вызывается успешно, однако для пользователя не добавляется ни одной строки.

TL; DR: пользователь нажимает кнопку добавления, он переходит к контроллеру, контроллер открывает JFileChooser, чтобы выбрать файл , затем вызывает searchmodel.addfile, который идет к модели, а затем вызывает addRow из abstractTableModel, который он вызывает, и тогда ничего не происходит, и я запутался в том, что я делаю неправильно, и мне нужна помощь.

1 Ответ

0 голосов
/ 15 апреля 2020

В модели я создавал новый экземпляр DBModel, когда мне следовало указывать его на OuterFrame.dbmodel, где у меня был JTable, который мне нужно было обновить.

Чтобы исправить мои спецификации c проблема заключалась в том, чтобы удалить мою предыдущую инициализацию dbmodel в модели, а затем вместо этого указать на мою dbmodel в представлении:

Model. java: 13

OuterFrame.dbmodel.addRow(Document);

Что тогда может добавить строку в JTable, потому что она указывает на правильную модель, а не на вновь созданную dbmodel.

Решение было достигнуто благодаря помощи / u / chickenmeister .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...