【问题标题】:Unable to add a row to my JTable with AbstractTableModel mapping to database无法通过 AbstractTableModel 映射到数据库向我的 JTable 添加行
【发布时间】:2020-04-14 06:12:47
【问题描述】:

我有一个 JPA 实体,我正尝试将它保存在 Derby 数据库中并将该数据库显示给用户。

目前我能够做到这一点。但是,我想在将数据库添加到数据库后立即为用户更新数据库,目前,程序必须退出然后重新启动以向用户显示更新的 JTable。

我正在使用 AbstractTableModel 将我的数据库表映射到 JTable in the View

我相信问题出在我的 abstractTableModel 中的 setValueAt() 中,但我真的不知道。

这是我的 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 的模型。有点儿。我的意思是它接受 fileDoc 实体的 resultList 并将实体添加到 resultList。

您可以在The View 中看到我是如何调用JTable 的。

当用户点击视图中的添加按钮时,它会将它们发送到The Controller 中的事件处理程序(第 55 行)

然后在The Model 中,我从AbstractTableModel 中调用addRow 方法。我知道该方法已成功调用,但没有添加任何行供用户查看。

TL;DR: 用户单击添加按钮,它进入控制器,控制器打开 JFileChooser 以选择一个文件,然后调用 searchmodel.addfile 进入模型,然后从它调用的 abstractTableModel 调用 addRow,然后什么也没有发生,我我对自己做错了什么感到困惑,需要帮助。

【问题讨论】:

    标签: java database swing jtable derby


    【解决方案1】:

    在模型中,我创建了一个新的 DBModel 实例,而我应该将它指向 OuterFrame.dbmodel,这是我需要更新 JTable 的地方。

    要解决我的具体问题,它是删除我之前在模型中初始化的 dbmodel,然后在视图中指向我的 dbmodel:

    Model.java:13

    OuterFrame.dbmodel.addRow(Document);
    

    然后能够向 JTable 添加一行,因为它指向正确的模型而不是新创建的 dbmodel。

    感谢/u/chickenmeister 的帮助,我们找到了解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-10
      • 1970-01-01
      • 1970-01-01
      • 2013-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多