JavaFX ArrayList в классе пусто при отправке на другой контроллер - PullRequest
0 голосов
/ 08 июня 2018

У меня есть класс инвентаря с ObservableArray типа Product, каждый из которых содержит массив деталей.На главном контроллере я предварительно заполняю некоторыми данными, и вывод системы показывает, что все значения есть, а массив частей присутствует.Проблема, с которой я сталкиваюсь, заключается в том, что, когда я нажимаю кнопку, чтобы открыть новый контроллер и заполнить значения продукта в поля, все поля продукта, кроме 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 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, как показано выше, в выводе системы отобразится виджет, а затем0.

1 Ответ

0 голосов
/ 08 июня 2018

Решение для меня - расслабиться и сделать перерыв в коде, @fabian указал, что он отлично работает, когда он попробовал, поэтому, оглядываясь назад на код, я заметил, что я случайно назначил все части продукту 1и, как идиот, которого я тестировал только на продукте 2 (последний в списке, который ближе к кнопке? не уверен, лол)

После обновления основных компонентов контроллера до lookupProduct (2) вместо 1, он работал простоштраф:

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