Java 使用AbstractTableModel从JTable中删除行

Java 使用AbstractTableModel从JTable中删除行,java,swing,jtable,defaulttablemodel,abstracttablemodel,Java,Swing,Jtable,Defaulttablemodel,Abstracttablemodel,我有一个JTable。此表使用我设计的自定义模型;自定义模型是扩展了AbstractTableModel。我有一个按钮,允许用户删除选中/突出显示的行 我尝试过这段代码,但它给了我一个类强制转换异常- myTableModel cannot be cast to DefaultTableModel. 下面是代码 DefaultTableModel model = (DefaultTableModel)table.getModel(); model.removeRow(tab

我有一个
JTable
。此表使用我设计的自定义模型;自定义模型是
扩展了AbstractTableModel
。我有一个按钮,允许用户删除选中/突出显示的行

我尝试过这段代码,但它给了我一个类强制转换异常-

myTableModel cannot be cast to DefaultTableModel. 
下面是代码

DefaultTableModel model =  (DefaultTableModel)table.getModel();
        model.removeRow(table.convertRowIndexToModel(table.getSelectedRow()));
        model.fireTableDataChanged();`
我搜索过网络,但它总是
DefaultTableModel
——但我有
abstarctablemodel

我们如何解决这个问题

我尝试过这段代码,但它给了我一个类强制转换异常- myTableModel无法转换为DefaultTableModel

错误是不言自明的:假设您为表提供了自己的表模型,那么
table.getModel()
将永远不会返回
DefaultTableModel
实例

我们如何解决这个问题

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

int modelRowIndex = table.convertRowIndexToModel(table.getSelectedRow());
MyTableModel model = (MyTableModel)table.getModel();
model.removeRowFromMyModel(modelRowIndex);
请参阅中从
AbstractTableModel
扩展而来的自定义表模型的完整示例

离题 我们永远不应该从外部明确地调用任何
fireXxx()
方法。当需要时,
AbstractTableModel
子类将在内部调用这些函数。IMHO这些应该受到
保护
而不是
公开
,以避免错误地使用它们。但出于某种原因,我不知道他们把它们公开了

我尝试过这段代码,但它给了我一个类强制转换异常- myTableModel无法转换为DefaultTableModel

错误是不言自明的:假设您为表提供了自己的表模型,那么
table.getModel()
将永远不会返回
DefaultTableModel
实例

我们如何解决这个问题

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

int modelRowIndex = table.convertRowIndexToModel(table.getSelectedRow());
MyTableModel model = (MyTableModel)table.getModel();
model.removeRowFromMyModel(modelRowIndex);
请参阅中从
AbstractTableModel
扩展而来的自定义表模型的完整示例

离题
我们永远不应该从外部明确地调用任何
fireXxx()
方法。当需要时,
AbstractTableModel
子类将在内部调用这些函数。IMHO这些应该受到
保护
而不是
公开
,以避免错误地使用它们。但由于某些原因,我不知道他们将它们公开了,如果它不是太大,请显示您的自定义模型。方法fireTableDataChanged在DefaultTableModel中实现,那么没有理由调用两次,fireTableDataChanged重置所有自定义方法(rendere和editor),阅读AbstractTableModels API,有一种方法可以删除行,并使用适当的通知程序not fireTableDataChanged“我搜索过web,但它始终是
DefaultTableModel
——但我有
AbstractTableModel
”,这是一个很好的理由,这就是一个例子。
DefaultTableModel
实现了此功能(并且没有已知的bug)。但为了更快地获得更好的帮助,请发布一个(最小完整可验证示例)或(简短、独立、正确的示例)。在问题解决后,我冒昧地回滚了您的大量编辑。请不要使现有应答无效请显示您的自定义模型,如果它不是太大。方法fireTableDataChanged在DefaultTableModel中实现,那么没有理由调用两次,fireTableDataChanged重置所有自定义方法(rendere和editor),读取AbstractTableModels API,有一种方法可以删除行,并使用适当的通知程序not fireTableDataChanged“我搜索过web,但它始终是
DefaultTableModel
——但我有
AbstractTableModel
”,这是一个很好的理由,这就是一个例子。
DefaultTableModel
实现了此功能(并且没有已知的bug)。但为了更快地获得更好的帮助,请发布一个(最小完整可验证示例)或(简短、独立、正确的示例)。在问题解决后,我冒昧地回滚了您的大量编辑。请不要使现有答案1+
无效。我认为这些应该得到保护,而不是公开,以避免错误地使用它们。
好的一点,这将使我们的生活更轻松;)@dic 19我遵循了您向我展示的模型,但它给了我一个错误,如编辑的问题所示。我们如何解决此错误?如果我错了,请纠正我,但即使使用向下投射,您也无法解决此问题,因为您仍然无法从
DefaultTableModel
访问方法
removeRow(int rowIndex)
。你是在建议他实现自己的方法来删除所需的行吗?@JesseJames Hi,是的,OP实际上说明了这一点:此表使用的是我设计的自定义模型;自定义模型是extends AbstractTableModel1+
。我认为这些应该得到保护,而不是公开,以避免错误地使用它们。
好的一点,这将使我们的生活更轻松;)@dic 19我遵循了您向我展示的模型,但它给了我一个错误,如编辑的问题所示。我们如何解决此错误?如果我错了,请纠正我,但即使使用向下投射,您也无法解决此问题,因为您仍然无法从
DefaultTableModel
访问方法
removeRow(int rowIndex)
。你是在建议他实现自己的方法来删除所需的行吗?@JesseJames Hi,是的,OP实际上说明了这一点:此表使用的是我设计的自定义模型;自定义模型是extends AbstractTableModel