如何在另一个类中访问ListView元素?解决实例返回null问题
问题分析与解决方案
核心问题
你代码里的Controller类中声明的controller变量从未被初始化,在OrderIn方法里调用i.writeToFile(FileName, controller)时传入的是null,所以writeToFile方法里通过controller.getListtaking()获取到的temp自然是null。
修复步骤
初始化Controller实例
在Controller类的OrderIn方法里,把controller赋值为当前实例:// 在OrderIn方法内合适位置添加 controller = this;这样调用
i.writeToFile(FileName, controller)时传入的就是有效的Controller实例,就能正确获取到listtaking。优化文件操作(推荐)
原代码的文件流操作未使用自动关闭机制,容易导致资源泄漏,改成try-with-resources写法:public void writeToFile(String file, Controller controller) throws IOException { try (FileWriter fw = new FileWriter(file, true); BufferedWriter bw = new BufferedWriter(fw)) { ListView<Items> temp = controller.getListtaking(); if (temp == null) { // 增加空判断,避免空指针异常 return; } for (Items item : temp.getItems()) { bw.write(item + ",\n"); // 用通用换行符替代\r } bw.write(totalorder + "\n"); bw.write(";\n"); } }简化写入逻辑(可选)
当前每个Items单独写入文件的方式会重复打开流,效率较低,可改为在Controller中统一写入:public void OrderIn(ActionEvent actionEvent) throws IOException { Orders orderin = new Orders(total); totalorder = total; System.out.println(orderin.totalcost); System.out.println(orderin); System.out.println(listtaking.getItems()); listcurrent.getItems().add(orderin); listorder = listtaking; String fileName = String.valueOf(Orders.ordernumber); File orderFile = new File(fileName + ".txt"); // 统一写入文件 try (FileWriter fw = new FileWriter(orderFile, true); BufferedWriter bw = new BufferedWriter(fw)) { for (Items item : listtaking.getItems()) { bw.write(item + ",\n"); } bw.write(totalorder + "\n"); bw.write(";\n"); } listtaking.getItems().clear(); }这种写法不需要在Items类中定义writeToFile方法,也避免了传递Controller实例的问题,逻辑更清晰。
读取文件并显示到另一个ListView的实现思路
按行读取文件内容,解析出Items对象后添加到目标ListView的数据源中:
public void readFromFile(String filePath, ListView<Items> targetListView) throws IOException { ObservableList<Items> items = FXCollections.observableArrayList(); try (FileReader fr = new FileReader(filePath); BufferedReader br = new BufferedReader(fr)) { String line; while ((line = br.readLine()) != null) { if (line.equals(";")) { // 遇到分号结束当前订单读取 break; } if (line.equals(totalorder)) { // 跳过总价行 continue; } // 根据Items类的构造方法解析行内容,这里需根据实际情况调整 Items item = new Items(line.replace(",", "")); items.add(item); } } targetListView.setItems(items); }
内容的提问来源于stack exchange,提问作者Cristian
相关产品推荐
相关产品推荐

