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

Java Swing密码管理器项目JTable行数正确但行内容为空求助

问题根因

代码存在两个核心错误:

  • Java类实例化时,成员变量初始化执行优先级高于构造函数内部逻辑。你在类定义处直接初始化DefaultTableModel时,accEmail还未通过构造函数调用retrieveAccountInfo赋值,此时传入modelCredentials的参数为null,后续accEmail赋值完成后,已初始化的表格模型不会自动同步数据。
  • modelCredentials方法的数组处理逻辑存在缺陷:每次循环都对数组进行扩容,但非匹配邮箱的行对应数组位置未赋值,导致返回的二维数组存在大量空元素,最终表现为表格行数正确但内容为空。

另外你定义的Account acc成员变量无实际作用,初始化时accName、accEmail、accPass均为默认值null,可以直接删除。

修复方案
  1. 调整表格相关组件的初始化时机:仅先声明相关成员变量,将初始化逻辑移到构造函数中retrieveAccountInfo执行完成之后。
  2. 优化modelCredentials方法实现,用集合暂存匹配结果再转数组,避免空元素产生。

代码修改示例

成员变量部分修改

// 仅声明成员变量,暂不初始化
String[] columns = { "Credential Name", "Username" };
DefaultTableModel model;
JTable credentialTable;
JScrollPane tableScroll;

构造函数调整

MainFrame(Account a) {
    retrieveAccountInfo(a);
    // accEmail赋值完成后再初始化表格
    initTableModel();
    setLayoutManager();
    setLocationAndSize();
    addComponentsToContainer();
    addActionEvent();
}

// 新增表格初始化方法
private void initTableModel() {
    model = new DefaultTableModel(modelCredentials(accEmail), columns) {
        @Override
        public boolean isCellEditable(int row, int column) {
            return false;
        }
    };
    credentialTable = new JTable(model);
    tableScroll = new JScrollPane(credentialTable);
}

优化modelCredentials方法

public String[][] modelCredentials(String email) {
    List<String[]> matchedList = new ArrayList<>();
    int lineNo = 1;
    String line;
    while ((line = readCredentialLine(lineNo)) != null) {
        String[] var = line.split(":");
        if (var[0].equals(email)) {
            matchedList.add(new String[]{var[1], var[2]});
        }
        lineNo++;
    }
    return matchedList.toArray(new String[0][]);
}

内容的提问来源于stack exchange,提问作者ACupOfJava

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 12:06:04