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

如何在另一个类中访问ListView元素?解决实例返回null问题

问题分析与解决方案

核心问题

你代码里的Controller类中声明的controller变量从未被初始化,在OrderIn方法里调用i.writeToFile(FileName, controller)时传入的是null,所以writeToFile方法里通过controller.getListtaking()获取到的temp自然是null。

修复步骤

  1. 初始化Controller实例
    在Controller类的OrderIn方法里,把controller赋值为当前实例:

    // 在OrderIn方法内合适位置添加
    controller = this;
    

    这样调用i.writeToFile(FileName, controller)时传入的就是有效的Controller实例,就能正确获取到listtaking。

  2. 优化文件操作(推荐)
    原代码的文件流操作未使用自动关闭机制,容易导致资源泄漏,改成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");
        }
    }
    
  3. 简化写入逻辑(可选)
    当前每个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 04:09:27