无法使用 AbstractTableModel 映射到数据库向我的 JTable 添加行
Unable to add a row to my JTable with AbstractTableModel mapping to database
我有一个 JPA 实体,我试图将其保存在 Derby 数据库中并将该数据库显示给用户。
目前我可以做到。但是,我想在将数据库添加到数据库后立即为用户更新数据库,因为目前,程序必须退出然后再次启动才能向用户显示更新的 JTable。
我正在使用 AbstractTableModel 将我的数据库 table 映射到 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 实体的结果列表并将该实体添加到结果列表。
您可以在 The View 中看到我如何调用 JTable。
当用户单击视图中的添加按钮时,它会将它们发送到 The Controller 中的事件处理程序(第 55 行)
然后在 The Model 中,我从 AbstractTableModel 调用 addRow 方法。我知道该方法已成功调用,但是没有添加任何行供用户查看。
长话短说:
用户单击添加按钮,它转到控制器,控制器打开 JFileChooser 到 select 一个文件,然后调用 searchmodel.addfile 转到模型,然后从它调用的 abstractTableModel 调用 addRow,然后什么也没发生,我对自己做错了什么感到困惑,需要帮助。
在模型中,我创建了一个新的 DBModel 实例,而我本应将其指向 OuterFrame.dbmodel,这是我需要更新的 JTable 所在的位置。
要解决我的具体问题,是删除我之前在模型中对 dbmodel 的初始化,然后在视图中指向我的 dbmodel:
Model.java:13
OuterFrame.dbmodel.addRow(Document);
然后可以向 JTable 添加一行,因为它指向正确的模型而不是新创建的 dbmodel。
在 /u/chickenmeister 的帮助下得到解决。
我有一个 JPA 实体,我试图将其保存在 Derby 数据库中并将该数据库显示给用户。
目前我可以做到。但是,我想在将数据库添加到数据库后立即为用户更新数据库,因为目前,程序必须退出然后再次启动才能向用户显示更新的 JTable。
我正在使用 AbstractTableModel 将我的数据库 table 映射到 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 实体的结果列表并将该实体添加到结果列表。
您可以在 The View 中看到我如何调用 JTable。
当用户单击视图中的添加按钮时,它会将它们发送到 The Controller 中的事件处理程序(第 55 行)
然后在 The Model 中,我从 AbstractTableModel 调用 addRow 方法。我知道该方法已成功调用,但是没有添加任何行供用户查看。
长话短说: 用户单击添加按钮,它转到控制器,控制器打开 JFileChooser 到 select 一个文件,然后调用 searchmodel.addfile 转到模型,然后从它调用的 abstractTableModel 调用 addRow,然后什么也没发生,我对自己做错了什么感到困惑,需要帮助。
在模型中,我创建了一个新的 DBModel 实例,而我本应将其指向 OuterFrame.dbmodel,这是我需要更新的 JTable 所在的位置。
要解决我的具体问题,是删除我之前在模型中对 dbmodel 的初始化,然后在视图中指向我的 dbmodel:
Model.java:13
OuterFrame.dbmodel.addRow(Document);
然后可以向 JTable 添加一行,因为它指向正确的模型而不是新创建的 dbmodel。
在 /u/chickenmeister 的帮助下得到解决。