如何使用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行数据,避免格式错误引发异常。 - 所有文件操作的异常需妥善捕获并给出明确提示,提升用户体验。
- 代码中原来的换行符转义错误
" "已修正为"\n",也可使用System.lineSeparator()适配不同系统的换行规则。
内容的提问来源于stack exchange,提问作者Myrkridia
相关产品推荐
相关产品推荐

