类中的JavaFX ArrayList在发送到另一个控制器时为空

时间:2018-06-08 03:25:16

标签: java javafx javafx-8

我有一个库存类,其中包含一个Product类型的ObservableArray,每个产品都包含一个部分的arraylist。在主控制器上,我预先填充了一些数据,系统输出显示值全部存在并且存在部件数组。我遇到的问题是,当我单击按钮打开一个新控制器并将产品值填充到字段中时,除了arraylist之外的所有产品字段都有数据,就像在该副本中擦除了arraylist一样。

产品类

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;
}

Part Class

private int partID;
private String name;
private double price;
private int inStock;
private int min;
private int max;

库存类

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);
    }
}

MainController

@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()都将返回有效信息,甚至在产品上getallassociatedparts大小也会显示它已填充。

ModifyProductController

public void displayProd (Product prod) {
    System.out.println(prod.getName());
    System.out.println(prod.getAllAssociatedParts().size());
}

此时,将显示产品名称(以及其中的任何其他字段),但关联的列表中没有任何内容。

例如,如果我如上所示通过了第1部分,系统输出会显示Widget,然后显示0。

1 个答案:

答案 0 :(得分:0)

解决方案是让我放松并从代码中休息一下,@ fabian指出它在尝试时工作正常,所以在回顾代码时我注意到我不小心将所有部件分配给了产品1 ,就像一个白痴我只在产品2上测试过(最后一个列表离按钮更近了?不确定大声笑)

将主控制器部件更新为lookupProduct(2)而不是1后,它工作得很好:

    inventory.lookupProduct(2).addAssociatedPart(inventory.lookupPart(2));
    inventory.lookupProduct(2).addAssociatedPart(inventory.lookupPart(3));