class 中的 JavaFX ArrayList 在发送到另一个控制器时为空
JavaFX ArrayList in class empty when sent to another controller
我有一个清单 class,其中包含一个产品类型的 ObservableArray,每个产品都包含一个零件数组列表。在主控制器上,我预先填充了一些数据,系统输出显示所有值都在那里,并且存在零件数组。我 运行 遇到的问题是当我单击一个按钮打开一个新控制器并将产品值填充到字段中时,除了 arraylist 之外的所有产品字段都有数据,就好像 arraylist 在该副本中被擦除一样.
产品Class
private ArrayList<Part> associatedParts = new ArrayList<>();
private int productID;
private String name;
private double price;
private int inStock;
private int min;
private int max;
public void addAssociatedPart(Part part) {
associatedParts.add(part);
}
public ArrayList<Part> getAllAssociatedParts() {
return associatedParts;
}
部分Class
private int partID;
private String name;
private double price;
private int inStock;
private int min;
private int max;
库存Class
private static ObservableList<Product> products = FXCollections.observableArrayList();
public ObservableList<Product> getAllProducts() {
return products;
}
public void addPart(Part part) {
allParts.add(part);
}
public void addProduct(Product prod) {
products.add(prod);
}
public Part lookupPart(int partid) {
if (partid > allParts.size() || partid < 1) {
return null;
}
else {
return allParts.get(partid-1);
}
}
主控制器
@Override
public void initialize(URL url, ResourceBundle rb) {
if (firstLoad) {
inventory.addPart(new Part(1,"Widget",1.13,5,1,8));
inventory.addPart(new Part(2,"Sprocket",2.88,5,1,8));
inventory.addPart(new Part(3,"Gear",3.46,5,1,8));
inventory.addProduct(new Product(1,"Dohicky",13.34,3,1,5));
inventory.lookupProduct(1).addAssociatedPart(inventory.lookupPart(1));
inventory.lookupProduct(1).addAssociatedPart(inventory.lookupPart(2));
inventory.addProduct(new Product(2,"Thingamajig",24.12,3,1,5));
inventory.lookupProduct(1).addAssociatedPart(inventory.lookupPart(2));
inventory.lookupProduct(1).addAssociatedPart(inventory.lookupPart(3));
}
tblProducts.setItems(inventory.getAllProducts());
}
@FXML
private void handleAddMod(ActionEvent event) throws IOException {
FXMLLoader loader = new FXMLLoader();
Stage stage = new Stage();
Parent root = null;
if (event.getSource() == btnProdMod && tblProducts.getSelectionModel().getSelectedItem() != null) {
Product prod = tblProducts.getSelectionModel().getSelectedItem();
loader.setLocation(getClass().getResource("ModifyProduct.fxml"));
root = loader.load();
loader.<ModifyProductController>getController().displayProd(prod);
}
if (root != null) {
Scene scene = new Scene(root);
stage.setScene(scene);
stage.initModality(Modality.APPLICATION_MODAL);
stage.showAndWait();
}
}
此时,任何给定产品上的 System.out.println() 都将 return 有效信息,甚至在产品上的 getallassociatedparts 尺寸显示它已填充。
修改产品控制器
public void displayProd (Product prod) {
System.out.println(prod.getName());
System.out.println(prod.getAllAssociatedParts().size());
}
此时,产品名称(以及其中的任何其他字段)将显示,但关联部件列表中没有任何内容。
例如,如果我如上所示通过了第 1 部分,系统输出会显示 Widget,后跟一个 0。
解决方案是让我冷静下来并从代码中休息一下,@fabian 指出他尝试时它工作正常,所以当回顾代码时我注意到我不小心将所有部分分配给产品 1,像个白痴一样,我只测试了产品 2(列表中的最后一个离按钮很近?不确定哈哈)
将主要控制器部分更新为 lookupProduct(2) 而不是 1 后,它工作得很好:
inventory.lookupProduct(2).addAssociatedPart(inventory.lookupPart(2));
inventory.lookupProduct(2).addAssociatedPart(inventory.lookupPart(3));
我有一个清单 class,其中包含一个产品类型的 ObservableArray,每个产品都包含一个零件数组列表。在主控制器上,我预先填充了一些数据,系统输出显示所有值都在那里,并且存在零件数组。我 运行 遇到的问题是当我单击一个按钮打开一个新控制器并将产品值填充到字段中时,除了 arraylist 之外的所有产品字段都有数据,就好像 arraylist 在该副本中被擦除一样.
产品Class
private ArrayList<Part> associatedParts = new ArrayList<>();
private int productID;
private String name;
private double price;
private int inStock;
private int min;
private int max;
public void addAssociatedPart(Part part) {
associatedParts.add(part);
}
public ArrayList<Part> getAllAssociatedParts() {
return associatedParts;
}
部分Class
private int partID;
private String name;
private double price;
private int inStock;
private int min;
private int max;
库存Class
private static ObservableList<Product> products = FXCollections.observableArrayList();
public ObservableList<Product> getAllProducts() {
return products;
}
public void addPart(Part part) {
allParts.add(part);
}
public void addProduct(Product prod) {
products.add(prod);
}
public Part lookupPart(int partid) {
if (partid > allParts.size() || partid < 1) {
return null;
}
else {
return allParts.get(partid-1);
}
}
主控制器
@Override
public void initialize(URL url, ResourceBundle rb) {
if (firstLoad) {
inventory.addPart(new Part(1,"Widget",1.13,5,1,8));
inventory.addPart(new Part(2,"Sprocket",2.88,5,1,8));
inventory.addPart(new Part(3,"Gear",3.46,5,1,8));
inventory.addProduct(new Product(1,"Dohicky",13.34,3,1,5));
inventory.lookupProduct(1).addAssociatedPart(inventory.lookupPart(1));
inventory.lookupProduct(1).addAssociatedPart(inventory.lookupPart(2));
inventory.addProduct(new Product(2,"Thingamajig",24.12,3,1,5));
inventory.lookupProduct(1).addAssociatedPart(inventory.lookupPart(2));
inventory.lookupProduct(1).addAssociatedPart(inventory.lookupPart(3));
}
tblProducts.setItems(inventory.getAllProducts());
}
@FXML
private void handleAddMod(ActionEvent event) throws IOException {
FXMLLoader loader = new FXMLLoader();
Stage stage = new Stage();
Parent root = null;
if (event.getSource() == btnProdMod && tblProducts.getSelectionModel().getSelectedItem() != null) {
Product prod = tblProducts.getSelectionModel().getSelectedItem();
loader.setLocation(getClass().getResource("ModifyProduct.fxml"));
root = loader.load();
loader.<ModifyProductController>getController().displayProd(prod);
}
if (root != null) {
Scene scene = new Scene(root);
stage.setScene(scene);
stage.initModality(Modality.APPLICATION_MODAL);
stage.showAndWait();
}
}
此时,任何给定产品上的 System.out.println() 都将 return 有效信息,甚至在产品上的 getallassociatedparts 尺寸显示它已填充。
修改产品控制器
public void displayProd (Product prod) {
System.out.println(prod.getName());
System.out.println(prod.getAllAssociatedParts().size());
}
此时,产品名称(以及其中的任何其他字段)将显示,但关联部件列表中没有任何内容。
例如,如果我如上所示通过了第 1 部分,系统输出会显示 Widget,后跟一个 0。
解决方案是让我冷静下来并从代码中休息一下,@fabian 指出他尝试时它工作正常,所以当回顾代码时我注意到我不小心将所有部分分配给产品 1,像个白痴一样,我只测试了产品 2(列表中的最后一个离按钮很近?不确定哈哈)
将主要控制器部分更新为 lookupProduct(2) 而不是 1 后,它工作得很好:
inventory.lookupProduct(2).addAssociatedPart(inventory.lookupPart(2));
inventory.lookupProduct(2).addAssociatedPart(inventory.lookupPart(3));