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

如何使用Java的JFrame修改txt文件及解决JTable出现空行的问题

问题解答

一、JTable出现空行的原因

  • 加载数据前未清空原有表格数据:viewbtn 触发时没有先移除DefaultTableModel中已有的行,多次点击查看按钮会重复追加数据,包括空行也会重复累加。
  • 空行读取未过滤:读取txt文件行时,没有过滤掉全空的行,文件末尾的换行、内容为空的行经过trim()后是长度为0的空字符串,调用addRow()后就会生成空行。
  • 提交数据时生成无效行:submitbtn的保存逻辑中没有做非空校验,如果用户未输入用户名/密码就提交,会生成只有逗号的无效行,读取后也会显示为空行。

GUI界面效果参考:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 19:15:04