首页 > 解决方案 > JavaFX:更新一个列表中的 Part 属性会更新另一个列表

问题描述

JavaFX 新手,请耐心等待。

应用: 库存管理系统。有零件,产品。产品可以有关联的部分。在添加/修改产品屏幕中,您可以从所有可用部件列表中添加与其关联的部件。

ISSUE: 所有零件清单都将库存水平更新为相关零件库存水平也更新的水平。我需要它保持不变(一旦弄清楚就不能处理减法)。

相关代码:

  public class ProductDetailController implements Initializable {
....
  public static ObservableList<Part> newListForTV = FXCollections.observableArrayList();
    public static ObservableList<Part> exListForTV =  FXCollections.observableArrayList();

    private void SetupGrids() {        
        colPartID.setCellValueFactory(new PropertyValueFactory<>("partID"));
        colPartName.setCellValueFactory(new PropertyValueFactory<>("name"));
        colInventory.setCellValueFactory(new PropertyValueFactory<>("inStock"));
        colPrice.setCellValueFactory(new PropertyValueFactory<>("price"));
        tvExistingParts.setItems(exListForTV);

        colNewPartID.setCellValueFactory(new PropertyValueFactory<>("partID"));
        colNewPartName.setCellValueFactory(new PropertyValueFactory<>("name"));
        colNewInventory.setCellValueFactory(new PropertyValueFactory<>("inStock"));
        colNewPrice.setCellValueFactory(new PropertyValueFactory<>("price"));
//        
        for (Part nPartsAll : Inventory.allParts) {
            if (!newListForTV.contains(nPartsAll)) {
                newListForTV.addAll(Inventory.allParts);
            }
        }

        tvNewParts.setItems(newListForTV);
    }




public void AddPart() {
        boolean partAvailable = false;
        int selectionCheck = tvNewParts.getItems().size();

        if (selectionCheck > 0) {
            partN = tvNewParts.getSelectionModel().getSelectedItem();  
            partAvailable = CheckPartInventory(partN);
            if (partAvailable) {
                partEX = CheckIfContainsPart(exListForTV, partN);
                if (partEX == null) {
                    tvExistingParts.getItems().add(partN);
                    partEX = CheckIfContainsPart(exListForTV, partN);
                    if (partEX.getPartID() == partN.getPartID()) {
                        ClearInventoryOfPart(partEX);
                        partEX.setInStock(1); 
                    }
                } else {
                        partEX.setInStock(partEX.getInStock() + 1);            
                        tvExistingParts.refresh();
                }
            }
        }
    }

    private Boolean CheckPartInventory(Part part) {
        boolean available = false;
        int invPartInven = 0, invPartMin = 0, invPartMax = 0;
        for (Part invPart : Inventory.allParts) {
            if (invPart.getPartID() == part.getPartID()) {
               invPartInven = invPart.getInStock();
               invPartMin = invPart.getMin();
               invPartMax = invPart.getMax();

               if (invPartInven <= invPartMin || invPartInven >= invPartMax || invPartInven == 0) {
                   available = false;
               } else {
                   available = true;
               }
            }
        }
        return available;
    }

    private void CommitSaveOfProduct() {
        try {
            if (newProduct == false) {
                exListForTV.forEach(part -> {
                    Product.addAssociatedPart(part);
                });

                Inventory.updateProduct(new AssociatedProParts(Integer.parseInt(tfID.getText()), tfName.getText(), Double.parseDouble(tfPrice.getText()),Integer.parseInt(tfINV.getText()),Integer.parseInt(tfMin.getText()),Integer.parseInt(tfMax.getText()),exListForTV));
                genericClass.DisplayInformationAlert("Existing product has been successfully saved.");
                tvExistingParts.getItems().clear();
                genericClass.GoToPage(btnCancel, constants.productNavLocation, constants.productPageTitle);
            } else if (newProduct == true) {
                Inventory.addProduct(new AssociatedProParts(tfName.getText(), Double.parseDouble(tfPrice.getText()),Integer.parseInt(tfINV.getText()),Integer.parseInt(tfMin.getText()),Integer.parseInt(tfMax.getText()),exListForTV));
                genericClass.DisplayInformationAlert("New product has been successfully saved.");

                tvExistingParts.getItems().clear();
                genericClass.GoToPage(btnCancel, constants.productNavLocation, constants.productPageTitle);
            }
        } catch (Exception ex) {
            genericClass.DisplayErrorAlert("Saving Product has failed...");    
        }
    }


........


}
    public class Inventory {
    public static ObservableList<Product> allProducts = FXCollections.observableArrayList();
    public static ObservableList<Part> associatedParts = FXCollections.observableArrayList();
    public static ObservableList<Part> allParts = FXCollections.observableArrayList();;


.......

}

public class AssociatedProParts extends Product {

    public static ObservableList<Part> aParts = FXCollections.observableArrayList();

    public AssociatedProParts() {
        super(0,"",0,0,0,0);
    }

    public AssociatedProParts(int productID, String name, double price, int inStock, int min, int max, ObservableList<Part> associatedParts) {   
        super(productID, name, price, inStock, min, max);
         aParts.addAll(associatedParts);
    }

    public AssociatedProParts(String name, double price, int inStock, int min, int max, ObservableList<Part> associatedParts) {   
        super(name, price, inStock, min, max);
        aParts.addAll(associatedParts);
    }

    public void setAParts(Part part) {
        aParts.add(part);
        Inventory.associatedParts.addAll(aParts);
    }
    public ObservableList<Part> getAParts() {
        return aParts;
    }
}

最后: 我的问题是 newListForTV 将库存水平更新为 exListForTV。newListForTV 不需要改变。这让我发疯了。 是的,我仍然需要仔细检查并清理和抽象事物,以免变得如此混乱。现在,我只需要这个工作。

标签: javafxjavafx-2observablelist

解决方案


虽然我想找到一种更有效的方法。我已经设法通过在零件中添加另一个 getter/setter 来解决库存变化的问题。


推荐阅读