You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将数据库表格添加至Form时遇方法适配错误的解决求助

问题解决:无法将TableModel添加到容器的错误

错误原因

你遇到的错误是因为**TableModel是数据模型类,不是Codename One的UI组件**,容器的add方法仅支持添加继承自Component的UI元素,直接传入TableModel不符合方法参数要求。

修复步骤

  1. 将TableModel包装为Table组件:创建Table实例并传入TableModel,再将Table添加到容器中。
  2. 补充资源清理逻辑:在Form销毁时清理数据库和游标资源,避免内存泄漏。
  3. 清理冗余导入:手动删除代码中未使用的导入语句,减少冗余。

修复后的完整代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 19:51:06