Java Swing密码管理器项目JTable行数正确但行内容为空求助
问题根因
代码存在两个核心错误:
- Java类实例化时,成员变量初始化执行优先级高于构造函数内部逻辑。你在类定义处直接初始化
DefaultTableModel时,accEmail还未通过构造函数调用retrieveAccountInfo赋值,此时传入modelCredentials的参数为null,后续accEmail赋值完成后,已初始化的表格模型不会自动同步数据。 modelCredentials方法的数组处理逻辑存在缺陷:每次循环都对数组进行扩容,但非匹配邮箱的行对应数组位置未赋值,导致返回的二维数组存在大量空元素,最终表现为表格行数正确但内容为空。
另外你定义的Account acc成员变量无实际作用,初始化时accName、accEmail、accPass均为默认值null,可以直接删除。
修复方案
- 调整表格相关组件的初始化时机:仅先声明相关成员变量,将初始化逻辑移到构造函数中
retrieveAccountInfo执行完成之后。 - 优化
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
相关产品推荐
相关产品推荐

