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

JavaFX双控制器通信问题:订单完成后无法清空购物车

JavaFX控制器通信问题:下单后无法清空购物车的修复方案

你的问题核心在于ViewSwitcher的controllers集合从未被填充,导致ViewSwitcher.lookup(View.MAIN)返回null,清空购物车的代码根本没执行。另外,购物车的总价也需要在清空时同步重置,以下是分步修复方案:


1. 修复ViewSwitcher,正确存储控制器实例

原代码使用FXMLLoader.load()静态方法无法获取控制器实例,需要手动创建FXMLLoader对象,加载后将控制器存入controllers集合:

package com.example.takeaway2;

import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class ViewSwitcher {

    private static Scene scene;
    private static Map<View, Parent> cache = new HashMap<>();
    private static final Map<View, Object> controllers = new HashMap<>();

    public static void setScene(Scene scene) {
        ViewSwitcher.scene = scene;
    }

    public static void switchTo(View view) {
        if (scene == null) {
            System.out.println("No scene was set");
            return;
        }

        try {
            Parent root;

            if (cache.containsKey(view)) {
                System.out.println("Loading from cache");
                root = cache.get(view);
            } else {
                System.out.println("Loading from FXML");
                FXMLLoader loader = new FXMLLoader(ViewSwitcher.class.getResource(view.getFileName()));
                root = loader.load();
                // 存储控制器实例到集合中
                controllers.put(view, loader.getController());
                cache.put(view, root);
            }

            scene.setRoot(root);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static Object lookup(View v) {
        return controllers.get(v);
    }
}

2. 完善PontunController的清空方法,同步重置总价

原clearkarfa方法只清空了列表项,未重置购物车的总价属性,补充如下:

public void clearkarfa() {
    fxkarfa.getItems().clear();
    // 重置总价并更新标签
    karfa.heildarVerdProperty().set(0);
    heildarVerdLabel.setText("0");
}

3. 验证GreidslaController的逻辑

原onForward方法的执行顺序正确(先清空再切换视图),现在控制器能正常获取,无需修改:

public void onForward(ActionEvent actionEvent) {
    clearFxkarfa();
    ViewSwitcher.switchTo(View.MAIN);
}

额外优化建议

建议将购物车列表与Karfa模型绑定,实现视图与数据的自动同步,避免手动维护数据的错误:
在PontunController的initialize方法中添加:

// 假设Karfa类中有ObservableList<Veitingar>类型的属性veitingarList
fxkarfa.setItems(karfa.getVeitingarList());
// 绑定总价标签,自动更新
heildarVerdLabel.textProperty().bind(karfa.heildarVerdProperty().asString());

此时清空购物车只需操作模型:

public void clearkarfa() {
    karfa.getVeitingarList().clear();
    karfa.heildarVerdProperty().set(0);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 13:37:03