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
相关产品推荐
相关产品推荐

