我有一张关于AbstractTableModel的表。表中的数据存储在Vector中。 现在,当我删除一行时,我将从向量中成功删除它,但这不会在视图中更新,即在GUI中。
我在其他地方读过我需要使用fireTableRowsDeleted(),我试图在AbstractTableModel中的包装器方法中调用它:
dataModel = new AbstractTableModel() {
public void removeAl() {
fireTableRowsDeleted(0, getRowCount()-1);
}
};
但是,这个removeAl对我来说无法访问。我不能在任何地方这样称呼它:dataModel.removeAl()
你能帮我理解出了什么问题吗?如何在删除行时更新GUI?
编辑: 事实证明,问题出在其他地方。一旦我修复了它,从Vector本身删除行开始更新GUI。 :)
答案 0 :(得分:3)
除了mdma所说的,你还需要覆盖TableModel
接口中的以下方法(它们未被AbstractTableModel
实现),因此你无法实例化任何AbstractTableModel
子类除非它覆盖这些方法:
public int getRowCount();
public int getColumnCount();
public Object getValueAt(int row, int column);
最后,仅仅在removeAll()
方法中触发tableRowsDeleted是不够的,你需要对之前的3个方法返回的内容产生影响;即在调用removeAll()
之后,您应该确保getRowCount()
返回0,否则您将遇到问题(NullPointerException
或等同于最坏情况,JTable
刷新问题最好的情况)!
也许你最好在第一步中使用DefaultTableModel
,这样可能会让你更容易。从AbstractTableModel
派生出来的时间会更晚。这很大程度上取决于你想要做什么......
答案 1 :(得分:1)
您无法看到您的removeAll
方法是因为它是在匿名类中声明的 - 匿名类不能通过名称引用,其中的任何新声明都无法访问。出于这个原因,匿名类中的公共声明通常是覆盖的,因为它们将通过使用非匿名基类来提供。
要解决此问题,请将您的表模型声明为AbstractTableModel
public class MyTableModel extends AbstractTableModel {
public void removeAll() {
fireTableRowsDeleted(...);
}
}
然后,您的客户端代码必须转换为MyTableModel才能访问removeAll()
方法。
更简单但更差的解决方案是继续让客户使用AbstractTableModel
,并让客户明确呼叫fireTableRowsDeleted()
。