如何使用Java的JFrame修改txt文件及解决JTable出现空行的问题
问题解答
一、JTable出现空行的原因
- 加载数据前未清空原有表格数据:
viewbtn触发时没有先移除DefaultTableModel中已有的行,多次点击查看按钮会重复追加数据,包括空行也会重复累加。 - 空行读取未过滤:读取txt文件行时,没有过滤掉全空的行,文件末尾的换行、内容为空的行经过
trim()后是长度为0的空字符串,调用addRow()后就会生成空行。 - 提交数据时生成无效行:
submitbtn的保存逻辑中没有做非空校验,如果用户未输入用户名/密码就提交,会生成只有逗号的无效行,读取后也会显示为空行。
GUI界面效果参考:
二、txt文件编辑功能实现代码
公共工具方法:将表格数据全量回写至txt文件
增删改操作后统一调用该方法同步到本地文件
private void writeTableToTxt() { try { // 覆盖写入模式,替换原有文件内容 PrintWriter printer = new PrintWriter(new FileOutputStream("logindata.txt")); DefaultTableModel model = (DefaultTableModel) datatable.getModel(); // 写入表头 for (int i = 0; i < model.getColumnCount(); i++) { if (i > 0) printer.print("/"); printer.print(model.getColumnName(i)); } printer.println(); // 逐行写入表格内容,自动过滤空行 for (int i = 0; i < model.getRowCount(); i++) { boolean isEmptyRow = true; StringBuilder line = new StringBuilder(); for (int j = 0; j < model.getColumnCount(); j++) { Object val = model.getValueAt(i, j); String cell = val == null ? "" : val.toString().trim(); if (cell.length() > 0) isEmptyRow = false; if (j > 0) line.append(","); line.append(cell); } if (!isEmptyRow) { printer.println(line); } } printer.close(); } catch (Exception e) { JOptionPane.showMessageDialog(null, "文件保存失败,请重试"); } }
优化后的查看按钮代码(彻底解决空行问题)
private void viewbtnActionPerformed(java.awt.event.ActionEvent evt) { try{ BufferedReader br = new BufferedReader(new FileReader("logindata.txt")); String firstLine = br.readLine().trim(); String[] columnsName = firstLine.split("/"); DefaultTableModel model = (DefaultTableModel)datatable.getModel(); // 先清空原有所有行,避免重复累加 model.setRowCount(0); model.setColumnIdentifiers(columnsName); Object[] tableLines = br.lines().toArray(); for(int i = 0; i < tableLines.length; i++) { String line = tableLines[i].toString().trim(); // 过滤空行,不加入表格 if (line.length() == 0) continue; String[] dataRow = line.split(","); // 补全列数,避免数组长度和列数不匹配 if (dataRow.length < columnsName.length) { String[] temp = new String[columnsName.length]; System.arraycopy(dataRow, 0, temp, 0, dataRow.length); dataRow = temp; } model.addRow(dataRow); } br.close(); } catch(Exception ep){ Logger.getLogger(people_info.class.getName()).log(Level.SEVERE, null, ep); } }
删除按钮实现
private void delbtnActionPerformed(java.awt.event.ActionEvent evt) { DefaultTableModel model = (DefaultTableModel) datatable.getModel(); int selectedRow = datatable.getSelectedRow(); if (selectedRow == -1) { JOptionPane.showMessageDialog(null, "请先选中要删除的行"); return; } model.removeRow(selectedRow); writeTableToTxt(); JOptionPane.showMessageDialog(null, "删除成功"); }
修改按钮实现
private void modifybtnActionPerformed(java.awt.event.ActionEvent evt) { DefaultTableModel model = (DefaultTableModel) datatable.getModel(); int selectedRow = datatable.getSelectedRow(); if (selectedRow == -1) { JOptionPane.showMessageDialog(null, "请先选中要修改的行"); return; } String newUser = newusername.getText().trim(); String newPass = newpass.getText().trim(); if (newUser.length() == 0 || newPass.length() == 0) { JOptionPane.showMessageDialog(null, "用户名和密码不能为空"); return; } // 修改选中行的用户名、密码(前两列,可根据实际列顺序调整索引) model.setValueAt(newUser, selectedRow, 0); model.setValueAt(newPass, selectedRow, 1); writeTableToTxt(); JOptionPane.showMessageDialog(null, "修改成功"); newusername.setText(""); newpass.setText(""); }
输入框事件实现
private void newpassActionPerformed(java.awt.event.ActionEvent evt) { // 密码输入框回车触发新增操作 String newUser = newusername.getText().trim(); String newPass = newpass.getText().trim(); if (newUser.length() == 0 || newPass.length() == 0) { JOptionPane.showMessageDialog(null, "用户名和密码不能为空"); return; } DefaultTableModel model = (DefaultTableModel) datatable.getModel(); model.addRow(new Object[]{newUser, newPass, "", "", ""}); writeTableToTxt(); JOptionPane.showMessageDialog(null, "新增成功"); newusername.setText(""); newpass.setText(""); } private void newusernameActionPerformed(java.awt.event.ActionEvent evt) { // 用户名输入框回车跳转到密码输入框 newpass.requestFocus(); }
优化原有注册提交按钮代码
private void submitbtnActionPerformed(java.awt.event.ActionEvent evt) { String user = usertxt.getText().trim(); String pass = passwordtxt.getText().trim(); if (user.length() == 0 || pass.length() == 0) { JOptionPane.showMessageDialog(null, "用户名和密码不能为空"); return; } try { FileOutputStream ldata = new FileOutputStream("logindata.txt", true); PrintWriter printer = new PrintWriter(ldata); printer.println(user+","+pass+",,,"); JOptionPane.showMessageDialog(null,"success, please login"); printer.close(); this.setVisible(false); login lg = new login(); lg.setVisible(true); } catch(Exception e) { JOptionPane.showMessageDialog(null,"Error, please retry"); } }
内容的提问来源于stack exchange,提问作者godopetza
相关产品推荐
相关产品推荐

