Java报错:Table类型未定义setModel(TableModel)方法如何解决
问题原因
报错的直接原因是组件类型声明完全错误:你用来承载表格的变量Table实际被声明为JTextArea(多行文本框组件),该类不存在setModel(TableModel)方法,自然会触发编译/运行报错。
除此之外你的代码里还有3处会导致功能无法正常运行的数据库逻辑错误:
- 定义了两个数据库连接对象
con和con1,connect()方法仅初始化了con,查询逻辑里用的是从未赋值的con1,会触发空指针 - 查询逻辑里给
insert对象绑定了SQL语句,执行时却调用了未初始化的pst对象的executeQuery()方法,且执行后没有将返回结果赋值给rs变量 - 类构造方法中没有调用
connect()初始化数据库连接,启动时连接对象为null
修复方案
- 修正表格组件声明
将原本错误的JTextArea声明替换为Swing表格组件JTable,同时建议遵循Java小驼峰命名规范,将大写开头的变量名改为小写,避免和类名混淆:JScrollPane scrollPane = new JScrollPane(); scrollPane.setBounds(429, 112, 380, 300); frame.getContentPane().add(scrollPane); // 移除错误的JTextArea声明 // JTextArea Table = new JTextArea(); // 替换为正确的JTable声明 JTable table = new JTable(); scrollPane.setViewportView(table); - 修正数据库查询逻辑
调整构造方法、表加载方法的逻辑顺序,修正对象引用错误:public SpendingsTrack() { initialize(); connect(); // 先初始化数据库连接,再加载数据 table_load(); } Connection con; PreparedStatement pst; ResultSet rs; // 无使用场景的con1、insert变量可直接删除,避免冗余 public void connect () { try { Class.forName("com.mysql.jdbc.Driver"); con = DriverManager.getConnection("jdbc:mysql://localhost:3306/unu","root",""); } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } } public void table_load() { try { pst = con.prepareStatement("select * from track2 "); rs = pst.executeQuery(); // 接收查询返回的结果集 table.setModel(DbUtils.resultSetToTableModel(rs)); }catch (SQLException e3){ e3.printStackTrace(); // 打印异常栈便于定位具体问题 JOptionPane.showMessageDialog(null, " Something is wrong with the table"); } }
优化建议:数据库操作完成后建议在finally块中主动关闭ResultSet、PreparedStatement、Connection对象,避免连接泄漏。
内容的提问来源于stack exchange,提问作者Qataw Razvan
相关产品推荐
相关产品推荐

