将数据库表格添加至Form时遇方法适配错误的解决求助
问题解决:无法将TableModel添加到容器的错误
错误原因
你遇到的错误是因为**TableModel是数据模型类,不是Codename One的UI组件**,容器的add方法仅支持添加继承自Component的UI元素,直接传入TableModel不符合方法参数要求。
修复步骤
- 将
TableModel包装为Table组件:创建Table实例并传入TableModel,再将Table添加到容器中。 - 补充资源清理逻辑:在Form销毁时清理数据库和游标资源,避免内存泄漏。
- 清理冗余导入:手动删除代码中未使用的导入语句,减少冗余。
修复后的完整代码
import com.codename1.ui.*; import com.codename1.ui.layouts.BorderLayout; import com.codename1.ui.layouts.BoxLayout; import com.codename1.ui.table.DefaultTableModel; import com.codename1.ui.table.Table; import com.codename1.ui.table.TableModel; import com.codename1.util.Util; import java.io.IOException; import java.util.ArrayList; public class Roster { Form rstr = new Form("Players", new BorderLayout()); private final int counter = 1; Database db; Cursor cur; Container bC; Container leftPanel = new Container(new BoxLayout(Y_AXIS)); String query = "Select * from players"; public Roster() throws IOException { db = Display.getInstance().openOrCreate("players.db"); cur = db.executeQuery(query); int columns = cur.getColumnCount(); if(columns > 0) { boolean next = cur.next(); if(next) { ArrayList<String[]> data = new ArrayList<>(); String[] columnNames = new String[columns]; for(int iter = 0 ; iter < columns ; iter++) { columnNames[iter] = cur.getColumnName(iter); } while(next) { Row currentRow = cur.getRow(); String[] currentRowArray = new String[columns]; for(int iter = 0 ; iter < columns ; iter++) { currentRowArray[iter] = currentRow.getString(iter); } data.add(currentRowArray); next = cur.next(); } Object[][] arr = new Object[data.size()][]; data.toArray(arr); TableModel tableModel = new DefaultTableModel(columnNames, arr); // 关键:创建Table UI组件,传入数据模型 Table table = new Table(tableModel); rstr.add(BorderLayout.CENTER, table); } } // 在Form销毁时自动清理资源 rstr.addDisposeListener(e -> { Util.cleanup(db); Util.cleanup(cur); }); rstr.show(); } }
额外说明
- 代码中将原
TableModel table重命名为tableModel,更清晰区分数据模型与UI组件。 - 通过
addDisposeListener绑定资源清理逻辑,确保Form关闭时释放数据库连接和游标。 - 移除了冗余的
new String("Select * from players")写法,直接使用字符串字面量更高效。
内容的提问来源于stack exchange,提问作者curtjacobs1
相关产品推荐
相关产品推荐

