2

我在 AbstractTableModel 上有一张桌子。表中的数据存储在 Vector 中。现在,当我删除一行时,我成功地从向量中删除了它,但这并没有在视图中更新,即在 GUI 中。

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

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

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

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

编辑:事实证明,问题出在其他地方。一旦我解决了这个问题,从 Vector 本身中删除该行就开始更新 GUI。:)

4

2 回答 2

3

除了 mdma 所说的之外,您还需要从TableModelinterface 覆盖以下方法(它们未实现AbstractTableModel),因此您不能实例化任何子AbstractTableModel类,除非它确实覆盖了这些方法:

public int getRowCount();
public int getColumnCount();
public Object getValueAt(int row, int column);

最后,仅在您的方法中触发 tableRowsDeletedremoveAll()是不够的,您需要对前 3 个方法返回的内容产生影响;即在removeAll()被调用之后,你应该确保getRowCount()返回0,否则你会遇到问题(NullPointerException或者在最坏的情况下等价,JTable在最好的情况下刷新问题)!

也许你最好DefaultTableModel在第一步使用,这可能会让你更容易。派生自AbstractTableModel会稍后出现。这几乎取决于您实际上想做什么...

于 2010-08-13T06:11:50.217 回答
1

您看不到您的removeAll方法,因为它是在匿名类中声明的 - 匿名类不能按名称引用,其中的任何新声明都无法访问。出于这个原因,匿名类中的公共声明通常是覆盖的,因为它们可以通过使用非匿名基类来使用。

要解决此问题,请将您的表模型声明为AbstractTableModel

public class MyTableModel extends AbstractTableModel {

   public void removeAll() {
      fireTableRowsDeleted(...);
   }
}

然后,您的客户端代码必须强制转换为 MyTableModel 才能访问该removeAll()方法。

一个更简单但更差的解决方案是继续让客户使用AbstractTableModel,并让客户显式调用fireTableRowsDeleted().

于 2010-08-13T00:31:39.113 回答