使用 AbstractTableModel 从 JTable 中删除一行

Removing a row from a JTable using AbstractTableModel

我有一个JTable。这个 table 使用的是我设计的自定义模型;自定义模型是 extends AbstractTableModel。我有一个按钮,可以让用户删除 selected/highlighted 行。

我试过这段代码,但它给了我一个 class 转换异常 -

myTableModel cannot be cast to DefaultTableModel. 

下面是代码。

DefaultTableModel model =  (DefaultTableModel)table.getModel();
        model.removeRow(table.convertRowIndexToModel(table.getSelectedRow()));
        model.fireTableDataChanged();`

我在网上搜索过,但它总是 DefaultTableModel - 但我有 AbstarctTableModel

我们如何解决这个问题?

I have tried this code but its giving me a class cast exception - myTableModel cannot be cast to DefaultTableModel.

这个错误是不言自明的:假设你为 table 提供了你自己的 table 模型,那么 table.getModel() 永远不会 return DefaultTableModel实例.

How do we solve this?

通过向下转换 table.getModel() 到适当的 class(您的 class)。然后调用您提供的方法从 table 模型中删除一行。例如:

int modelRowIndex = table.convertRowIndexToModel(table.getSelectedRow());
MyTableModel model = (MyTableModel)table.getModel();
model.removeRowFromMyModel(modelRowIndex);

查看从 this question 中的 AbstractTableModel 扩展的自定义 table 模型的完整示例。

题外话

我们绝不应该从外部显式调用任何 fireXxx() 方法。这些旨在在需要时由 AbstractTableModel subclasses 在内部调用。恕我直言,这些应该是 protected 而不是 public,以避免错误地使用它们。但出于某种原因,我不知道他们制造了它们 public