Java Swing - 使用AbstractTableModel()从表中删除行

时间:2010-08-13 00:18:21

标签: java swing jtable abstracttablemodel

我有一张关于AbstractTableModel的表。表中的数据存储在Vector中。 现在,当我删除一行时,我将从向量中成功删除它,但这不会在视图中更新,即在GUI中。

我在其他地方读过我需要使用fireTableRowsDeleted(),我试图在AbstractTableModel中的包装器方法中调用它:

dataModel = new AbstractTableModel() {
          public void removeAl() {
                  fireTableRowsDeleted(0, getRowCount()-1);
          }
};

但是,这个removeAl对我来说无法访问。我不能在任何地方这样称呼它:dataModel.removeAl()

你能帮我理解出了什么问题吗?如何在删除行时更新GUI?

编辑: 事实证明,问题出在其他地方。一旦我修复了它,从Vector本身删除行开始更新GUI。 :)

2 个答案:

答案 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()