Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当发送到另一个控制器时,类中的JavaFX ArrayList为空_Java_Javafx_Javafx 8 - Fatal编程技术网

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

当发送到另一个控制器时,类中的JavaFX ArrayList为空,java,javafx,javafx-8,Java,Javafx,Javafx 8,我有一个inventory类,其ObservableArray类型为Product,每个产品都包含一个部件的arraylist。在主控制器上,我预先填充了一些数据,系统输出显示所有值都在那里,并且存在部件数组。我遇到的问题是,当我单击一个按钮打开一个新控制器并将产品值填充到字段中时,除了arraylist之外的所有产品字段都有数据,就好像arraylist在该副本中被擦除一样 产品类别 private ArrayList<Part> associatedParts = new Arr

我有一个inventory类,其ObservableArray类型为Product,每个产品都包含一个部件的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;
}
存货类别

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);
    }
}
此时,将显示产品名称(以及其中的任何其他字段),但关联的零件列表中没有任何内容


例如,如上图所示,如果我通过了第1部分,系统输出会显示一个小部件,后面是一个0。

解决方案是让我冷静下来,从代码中休息一下,@fabian指出,当他尝试它时,它工作得很好,所以当回顾代码时,我注意到我意外地将所有部分分配给了产品1,像个白痴一样,我只测试了产品2(列表中最后一个离按钮这么近?不确定lol)

将主控制器部件更新为lookupProduct(2)而不是1后,工作正常:

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

库存产品如何加载到
tblProducts
?tblProducts.setItems(inventory.getAllProducts());我花了时间从中创建了可编译的代码(花了很长时间,您丢失了很多部分)。但在运行该应用程序后,该问题无法重现。投票赞成接近。顺便说一句,
products
是一个带有非静态getter的
static
字段。
List
类型的字段可以而且应该是
final
。您正在检查事件的
源代码
,而不是简单地将事件处理程序仅添加到您比较的按钮。此外,第二个if的主体可以集成到第一个if中,而不更改结果。此外,我还希望
firstLoad
设置为
false
。奇怪的是
所有部分
从未被删除声明,并且也未定义
lookupProduct()
。还不清楚第一个“在这一点上”是什么时候,你肯定知道有零件,第二个“在这一点上”是什么时候,哪些零件丢失了。还不清楚我通过了第1部分的内容,如上所示,系统输出显示了我的小部件,后面是一个0。
意思。@fabian你完全正确,它确实有效,我是个白痴,似乎我只是在测试产品id 2,当我今天早上查看时,我注意到在我的主初始化中,我意外地将所有零件分配给了产品1,所以产品2没有任何内容。
@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();
    }
}
public void displayProd (Product prod) {
    System.out.println(prod.getName());
    System.out.println(prod.getAllAssociatedParts().size());
}
    inventory.lookupProduct(2).addAssociatedPart(inventory.lookupPart(2));
    inventory.lookupProduct(2).addAssociatedPart(inventory.lookupPart(3));