Java Error : javax.swing.JTable$1 cannot be cast to javax.swing.table.DefaultTableModel
Java Error : javax.swing.JTable$1 cannot be cast to javax.swing.table.DefaultTableModel
我想做的是在 JPanel
和 JFrame
的新实例中创建一个 JTable
并且在添加行时出现错误table:
Object[] column = {"id", "title"};
Object[][] data = {};
JTable toDoTable = new JTable(data, column) {
public Component prepareRenderer(TableCellRenderer renderer, int rowIndex,
int columnIndex) {
if(columnIndex == 1) {
setFont(new Font("Arial", Font.BOLD, 12));
} else {
setFont(new Font("Arial", Font.ITALIC, 12));
}
return super.prepareRenderer(renderer, rowIndex, columnIndex);
}
};
JScrollPane jpane = new JScrollPane(toDoTable);
JPanel panel = new JPanel();
JFrame frame = new JFrame();
frame.setSize(new Dimension(1100, 408));
frame.setTitle("JTable Font Setting Example");
panel.add(jpane);
frame.add(new JScrollPane(panel));
frame.setVisible(true);
// Add rows in the Table
DefaultTableModel model = (DefaultTableModel)toDoTable.getModel();
ConnectMSSQLServer connServer = new ConnectMSSQLServer();
ResultSet rs = connServer.dbConnect();
try
{
while (rs.next()) {
String id = rs.getString("id");
String title = rs.getString("title");
model.addRow(new Object[]{id, title});
}
}
catch(Exception e)
{
}
在table
中添加行出现错误
考虑这个略有改动的代码:
//Create the new model for the table
DefaultTableModel model = new DefaultTableModel();
ConnectMSSQLServer connServer = new ConnectMSSQLServer();
//Try with catch for auto-closing result set
try(ResultSet rs = connServer.dbConnect()) {
while (rs.next()) {
String id = rs.getString("id");
String title = rs.getString("title");
model.addRow(new Object[] { id, title });
}
} catch (Exception e) {
//HANDLE THIS!
}
//Now populate the table with the new model
toDoTable.setModel(model);
这里的问题是您正在调用 JTable(Object[][], Object[])
构造函数。如果你查看 link 中的源代码,你可以看到它在内部调用 JTable(TableModel)
构造函数,构造了 AbstractTableModel
的匿名实例,这是由getModel()
方法 - 这不能转换为 DefaultTableModel
.
但是:您在这里尝试执行的操作无论如何都行不通。你是说数据的行由一个零元素数组表示:
Object[][] data = {};
您将无法向其中添加行,因为您无法在构建数组后调整其大小。
而不是这个,你应该构造一个明确的 DefaultTableModel
:
TableModel tableModel = new DefaultTableModel(column, rowCount);
然后用它来构造JTable
:
JTable toDoTable = new JTable(tableModel) { ... }
我根本不熟悉 swing,但看起来 DefaultTableModel
由行数据的 Vector
支持,因此您不需要知道 [= 的确切值=22=] 前面。
我想做的是在 JPanel
和 JFrame
的新实例中创建一个 JTable
并且在添加行时出现错误table:
Object[] column = {"id", "title"};
Object[][] data = {};
JTable toDoTable = new JTable(data, column) {
public Component prepareRenderer(TableCellRenderer renderer, int rowIndex,
int columnIndex) {
if(columnIndex == 1) {
setFont(new Font("Arial", Font.BOLD, 12));
} else {
setFont(new Font("Arial", Font.ITALIC, 12));
}
return super.prepareRenderer(renderer, rowIndex, columnIndex);
}
};
JScrollPane jpane = new JScrollPane(toDoTable);
JPanel panel = new JPanel();
JFrame frame = new JFrame();
frame.setSize(new Dimension(1100, 408));
frame.setTitle("JTable Font Setting Example");
panel.add(jpane);
frame.add(new JScrollPane(panel));
frame.setVisible(true);
// Add rows in the Table
DefaultTableModel model = (DefaultTableModel)toDoTable.getModel();
ConnectMSSQLServer connServer = new ConnectMSSQLServer();
ResultSet rs = connServer.dbConnect();
try
{
while (rs.next()) {
String id = rs.getString("id");
String title = rs.getString("title");
model.addRow(new Object[]{id, title});
}
}
catch(Exception e)
{
}
在table
中添加行出现错误考虑这个略有改动的代码:
//Create the new model for the table
DefaultTableModel model = new DefaultTableModel();
ConnectMSSQLServer connServer = new ConnectMSSQLServer();
//Try with catch for auto-closing result set
try(ResultSet rs = connServer.dbConnect()) {
while (rs.next()) {
String id = rs.getString("id");
String title = rs.getString("title");
model.addRow(new Object[] { id, title });
}
} catch (Exception e) {
//HANDLE THIS!
}
//Now populate the table with the new model
toDoTable.setModel(model);
这里的问题是您正在调用 JTable(Object[][], Object[])
构造函数。如果你查看 link 中的源代码,你可以看到它在内部调用 JTable(TableModel)
构造函数,构造了 AbstractTableModel
的匿名实例,这是由getModel()
方法 - 这不能转换为 DefaultTableModel
.
但是:您在这里尝试执行的操作无论如何都行不通。你是说数据的行由一个零元素数组表示:
Object[][] data = {};
您将无法向其中添加行,因为您无法在构建数组后调整其大小。
而不是这个,你应该构造一个明确的 DefaultTableModel
:
TableModel tableModel = new DefaultTableModel(column, rowCount);
然后用它来构造JTable
:
JTable toDoTable = new JTable(tableModel) { ... }
我根本不熟悉 swing,但看起来 DefaultTableModel
由行数据的 Vector
支持,因此您不需要知道 [= 的确切值=22=] 前面。