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

如何使用JFileChooser选择任意CSV文件并在表格中读写编辑?

解决JFileChooser选择CSV文件并实现读写编辑的问题

你的核心问题是DataDAO类硬编码了固定的file.csv文件,而open_file方法选中文件后没有将其传递给DataDAO,导致后续操作仍使用固定文件。以下是具体修改方案:

步骤1:重构DataDAO类,支持动态传入文件

移除硬编码的固定文件,改为实例变量存储当前选中的文件,并通过构造方法或setter传入:

public class DataDAO {
    private File currentFile; // 存储当前操作的CSV文件

    // 构造方法:初始化时传入目标文件
    public DataDAO(File file) {
        this.currentFile = file;
    }

    // 可选:添加setter方法,用于后续切换文件
    public void setCurrentFile(File file) {
        this.currentFile = file;
    }

    @Override
    public ArrayList<Data> list() throws Exception {        
        try{            
            ArrayList<Data> listData = new ArrayList<>();
            FileReader fr = new FileReader(currentFile);
            try (BufferedReader br = new BufferedReader(fr)) {
                String line;
                while((line=br.readLine())!=null){
                    Data objData = new Data(line);
                    listData.add(objData);
                }
            }
            return listData;
        }catch(IOException erro){
            throw erro;
        }
    }

    @Override
    public void add(Data objData) throws Exception {
        try{
            FileWriter fw = new FileWriter(currentFile, true);
            try (BufferedWriter bw = new BufferedWriter(fw)) {
                bw.write(objData.toString() + "\n");
            }
        }catch(IOException erro){
            throw erro;
        }
    }

    @Override
    public void remove(int code) throws Exception{
        ArrayList<Data> list = list();
        if(list.isEmpty()) return;
        FileWriter fw = new FileWriter(currentFile);
        try (BufferedWriter bw = new BufferedWriter(fw)) {
            for(Data p : list){
                if(p.getCode() != code){
                    bw.write(p.toString() + "\n");
                }
            }
        }
    }    

    @Override
    public void update(Data objData) throws Exception {
        try{
            ArrayList<Data> list = list();
            if(list.isEmpty()) return;
            FileWriter fw = new FileWriter(currentFile);
            try (BufferedWriter bw = new BufferedWriter(fw)) {
                for(Data p : list){
                    if(p.getCode() != objData.getCode()){
                        bw.write(p.toString() + "\n");
                    }else{
                        bw.write(objData.toString() + "\n");
                    }
                }
            }
        }catch(Exception erro){
            throw erro;
        }
    }
}

步骤2:修改UI层,维护当前操作的DataDAO实例

在UI类中添加成员变量存储当前的DataDAO实例,修改open_file方法传递选中的文件:

// UI类中添加成员变量
private DataDAO currentDataDAO;

private void open_file() {
    try{  
        FileNameExtensionFilter filter = new FileNameExtensionFilter(
            "仅CSV文件", "csv");
        chooser.setFileFilter(filter);
        chooser.setCurrentDirectory(new File("./"));
        int result = chooser.showOpenDialog(getParent());
        if (result == JFileChooser.APPROVE_OPTION) 
        {                
            File selectedFile = chooser.getSelectedFile();
            System.out.println(selectedFile.getAbsolutePath());
            // 初始化当前操作的DataDAO
            currentDataDAO = new DataDAO(selectedFile);
            // 刷新表格数据
            showData();            
        }            
    }catch(HeadlessException | IOException erro){
        JOptionPane.showMessageDialog(rootPane, "打开文件失败:" + erro.getMessage());
    } 
}

步骤3:修改showData方法,使用当前的DataDAO实例

避免每次新建DataDAO,直接使用UI类中维护的实例:

private void showData(){
    if(currentDataDAO == null){
        JOptionPane.showMessageDialog(rootPane, "请先选择一个CSV文件");
        return;
    }
    try{
        ArrayList<Data> list = currentDataDAO.list();
        DefaultTableModel model = (DefaultTableModel) jTable_Table1.getModel();
        model.setNumRows(0);
        for(Data aux : list){
            String[] line = new String[6];
            line[0] = String.valueOf(aux.getCode());
            line[1] = aux.getName();
            line[2] = String.valueOf(aux.getPrice());
            line[3] = String.valueOf(aux.getCargoN());
            line[4] = String.valueOf(aux.getTotal_Weight());
            line[5] = String.valueOf(aux.getTotal_Vol());
            model.addRow(line);
        }
    }catch (Exception erro){
        JOptionPane.showMessageDialog(rootPane, "加载数据失败:" + erro.getMessage());
    }
}

额外注意事项

  • 确保Data类的Data(String line)构造方法能正确解析CSV行数据,避免格式错误引发异常。
  • 所有文件操作的异常需妥善捕获并给出明确提示,提升用户体验。
  • 代码中原来的换行符转义错误&quot; &quot;已修正为"\n",也可使用System.lineSeparator()适配不同系统的换行规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 20:15:43