JTable 在调用 getModel() 时返回 JTable

JTable returning JTable when calling getModel()

我的 JTable 是这样声明的:

String[] cols = {"Name","Location"};
String[][] data = new String[][] {{"Name","Location"}};
JTable table = new JTable(data, cols);

所以我在尝试更新 JTable 的数据时遇到了一个问题...我想在 table 中添加一个新行。这是我的代码:

data = new String[][] {{"Name","Location"}{"Name1","Location1"}};
DefaultTableModel dm = (DefaultTableModel)(table.getModel());
dm.fireTableDataChanged();

出于某种原因,我在线上收到错误消息:

DefaultTableModel dm = (DefaultTableModel)(table.getModel());

显示的错误是...

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.JTable cannot be cast to javax.swing.table.DefaultTableModel
at client.pages.ClientPage.update(ClientPage.java:171)

我的ClientPage.java的第171行就是我说的上面那行代码的错误。

有人知道为什么要这样做吗?

table.getModel(); //Suppose to return TabelModel not JTable

table.getModel() 没有返回 JTable,它返回 JTable 中扩展 TableModelanonymous class。因此,table.getModel() 确实返回了正确的 class 类型。

但是,错误发生是因为您尝试将此匿名 table 模型转换为 DefaultTableModel,这是 TableModel 的另一个子 class,但不是table.getModel().

返回的类型

要解决此问题,只需将 table 模型视为接口类型 TableModel;不要假设它是 DefaultTableModel.

先看看 How to Use Tables and the JavaDocs for DefaultTabelModel

您应该将创建 table 和模型的方式更改为更类似于...

String[] cols = {"Name","Location"};
String[][] data = new String[][] {{"Name","Location"}};
JTable table = new JTable(new DefaultTableModel(date, cols));

JTable(Object[][], Object[]) 实际上使用了它自己的 TableModel

实现

接下来,改变....

data = new String[][] {{"Name","Location"}{"Name1","Location1"}};
DefaultTableModel dm = (DefaultTableModel)(table.getModel());
dm.fireTableDataChanged();

更像是...

data = new String[][] {{"Name","Location"}{"Name1","Location1"}};
DefaultTableModel dm = (DefaultTableModel)(table.getModel());
dm.fireTableDataChanged();

更像是...

data = new String[] {"Name1","Location1"};
DefaultTableModel dm = (DefaultTableModel)(table.getModel());
dm.addRow(data);