Java ArrayList 返回 0 值

Java ArrayList returning 0 value

我正在尝试在 java 上使用 swing 构建应用程序,用户需要输入一些产品并将它们存储在数组列表中,并在 table (JTable) 上显示产品列表在另一个 Jframe 中,我遇到的问题是,当我添加产品并单击列表按钮时,table 不包含产品,即使 Arraylist 大小 return 0

Class 产品

package Inventory;

public class Produit {
    private int code;
    private int StockInitial;
    private int StockEntree;
    private int StockSortie;
    private int StockReel;

    public Produit(int code, int StockInitial, int StockEntree, int StockSortie) {
        this.code = code;
        this.StockInitial = StockInitial;
        this.StockEntree = StockEntree;
        this.StockSortie = StockSortie;
        this.StockReel = (this.StockInitial+this.StockEntree)-this.StockSortie;
    }
    public void AjouterProduit(int code, int StockInitial, int StockEntree, int StockSortie) {
        this.code = code;
        this.StockInitial = StockInitial;
        this.StockEntree = StockEntree;
        this.StockSortie = StockSortie;
        this.StockReel = (this.StockInitial+this.StockEntree)-this.StockSortie;
    }

    public Produit() {
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public int getStockInitial() {
        return StockInitial;
    }

    public void setStockInitial(int StockInitial) {
        this.StockInitial = StockInitial;
    }

    public int getStockEntree() {
        return StockEntree;
    }

    public void setStockEntree(int StockEntree) {
        this.StockEntree = StockEntree;
    }

    public int getStockSortie() {
        return StockSortie;
    }

    public void setStockSortie(int StockSortie) {
        this.StockSortie = StockSortie;
    }

    public int getStockReel() {
        return this.StockReel;
    }

    public void setStockReel(int StockReel) {
        this.StockReel = StockReel;
    }
}

Class 库存 用户可以输入产品详细信息的 jframe

package Inventory;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.*;

public class Inventory extends JFrame implements ActionListener {

    public ArrayList<Produit> listProduit = new ArrayList<Produit>();
    JLabel l1 = new JLabel("Code : ");
    JLabel l2 = new JLabel("Stock initial : ");
    JLabel l3 = new JLabel("Stock entree : ");
    JLabel l4 = new JLabel("Stock sortie : ");
    JTextField t1 = new JTextField(20);
    JTextField t2 = new JTextField(20);
    JTextField t3 = new JTextField(20);
    JTextField t4 = new JTextField(20);
    JButton b1 = new JButton("Suivant");
    JButton b2 = new JButton("liste");
    JFrame frame = new JFrame("Inventory");
    public Inventory(){
        frame.setLayout(new FlowLayout());
        frame.setSize(400,300);
        frame.getContentPane().add(l1);
        frame.getContentPane().add(t1);
        frame.getContentPane().add(l2);
        frame.getContentPane().add(t2);
        frame.getContentPane().add(l3);
        frame.getContentPane().add(t3);
        frame.getContentPane().add(l4);
        frame.getContentPane().add(t4);
        frame.getContentPane().add(b1);
        frame.getContentPane().add(b2);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        b1.addActionListener(this);
        b2.addActionListener(this);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource()==b1){
            int code = Integer.parseInt(t1.getText());
            int StockInitial = Integer.parseInt(t2.getText());
            int StockEntree = Integer.parseInt(t3.getText());
            int StockSortie = Integer.parseInt(t4.getText());
            Produit p = new Produit(code,StockInitial,StockEntree,StockSortie);
            listProduit.add(p);
        }
        if(e.getSource()==b2) {
            new Liste().frame.setVisible(true);
        }
    }
    public ArrayList<Produit> getList() {
        return listProduit;
    }

    public static void main(String[] args) {
        new Inventory().frame.setVisible(true);
    }
}

Class库存向用户展示产品详情的jframe

package Inventory;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;

public class Liste extends JFrame {
    JFrame frame = new JFrame("Inventory");
    String head[] = {"Code","Stock Intial","Stock Entree","Stock Sortie","Sotck Reel"};
    String[][] Rows = {};
    DefaultTableModel model = new DefaultTableModel(Rows,head);
    Inventory n;
    JTable table = new JTable(model);
    JScrollPane sp = new JScrollPane(table);
    Container con = null;
    public Object[] objProduit;
    public void addRowToJTable()
    {

    }
    public Liste(){
        DefaultTableModel model = (DefaultTableModel) table.getModel();
        model.setRowCount(0);
        for(int i=0;i<n.listProduit.size();i++){
            Object[] obj = {n.listProduit.get(i).getCode(),n.listProduit.get(i).getStockInitial(),n.listProduit.get(i).getStockEntree(),n.listProduit.get(i).getStockSortie(),n.listProduit.get(i).getStockReel()};
            model.addRow(obj);
        }
        //return 0
        System.out.println(n.listProduit.size());
        frame.getContentPane().add(table);
        frame.setLayout(new FlowLayout());
        frame.setSize(400,300);
        frame.add(sp);
        }
}

如果您希望 Liste class 访问 Inventory class 的 listProduit,您有多种选择。

我喜欢的顺序:

1。将 listProduit 传递给 Liste 构造函数

actionPerformed()方法中,创建Liste实例如下:

new Liste(listProduit).frame.setVisible(true);

为此,您需要按如下方式更改 Liste 构造函数:

private List<Produit> listProduit;
public Liste(List<Produit> listProduit) {
    this.listProduit = listProduit;
    model.setRowCount(0);
    for (int i = 0; i < listProduit.size(); i++) {
        Produit p = listProduit.get(i);
        Object[] obj = { p.getCode(), p.getStockInitial(), p.getStockEntree(), p.getStockSortie(), p.getStockReel() };
        model.addRow(obj);
    }
    System.out.println(n.listProduit.size());
    frame.getContentPane().add(table);
    frame.setLayout(new FlowLayout());
    frame.setSize(400,300);
    frame.add(sp);
}

不需要 Liste class 中的字段 Inventory n


2。将 Inventory 实例传递给 Liste 构造函数

actionPerformed()方法中,创建Liste实例如下:

new Liste(this).frame.setVisible(true);

为此,您需要按如下方式更改 Liste 构造函数:

public Liste(Inventory inventory) {
    this.n = inventory;
    model.setRowCount(0);
    for (int i = 0; i < n.listProduit.size(); i++) {
        Produit p = n.listProduit.get(i);
        Object[] obj = { p.getCode(), p.getStockInitial(), p.getStockEntree(), p.getStockSortie(), p.getStockReel() };
        model.addRow(obj);
    }
    System.out.println(n.listProduit.size());
    frame.getContentPane().add(table);
    frame.setLayout(new FlowLayout());
    frame.setSize(400,300);
    frame.add(sp);
}

3。使 listProduit 成为静态字段

这只是为了完整性。您应该创建尽可能少的静态字段 - 静态字段是一种懒惰的“解决方案”,如果您的程序增长,它可能会产生大问题,并且从这种方法更改为更好的方法(最好是第一种方法)越难,您拥有的代码越多依赖于静态字段。

在classInventory中更改字段listProduit的声明如下:

public static List<Produit> listProduit = new ArrayList<Produit>();

然后您可以按如下方式更改 Liste 的构造函数:

public Liste(Inventory inventory) {
    model.setRowCount(0);
    for (int i = 0; i < Inventory.listProduit.size(); i++) {
        Produit p = Inventory.listProduit.get(i);
        Object[] obj = { p.getCode(), p.getStockInitial(), p.getStockEntree(), p.getStockSortie(), p.getStockReel() };
        model.addRow(obj);
    }
    System.out.println(n.listProduit.size());
    frame.getContentPane().add(table);
    frame.setLayout(new FlowLayout());
    frame.setSize(400,300);
    frame.add(sp);
}

您可以使用增强的 for 循环或使用 List 接口的 forEach() 方法进一步改进构造函数。

使用增强的 for 循环:

private List<Produit> listProduit;
public Liste(List<Produit> listProduit) {
    this.listProduit = listProduit;
    model.setRowCount(0);
    for (Produit p: listProduit) {
        Object[] obj = { p.getCode(), p.getStockInitial(), p.getStockEntree(), p.getStockSortie(), p.getStockReel() };
        model.addRow(obj);
    }
    System.out.println(n.listProduit.size());
    frame.getContentPane().add(table);
    frame.setLayout(new FlowLayout());
    frame.setSize(400,300);
    frame.add(sp);
}

forEach():

private List<Produit> listProduit;
public Liste(List<Produit> listProduit) {
    this.listProduit = listProduit;
    model.setRowCount(0);
    listProduit.forEach(p -> {
        Object[] obj = { p.getCode(), p.getStockInitial(), p.getStockEntree(), p.getStockSortie(), p.getStockReel() };
        model.addRow(obj);
    });
    System.out.println(n.listProduit.size());
    frame.getContentPane().add(table);
    frame.setLayout(new FlowLayout());
    frame.setSize(400,300);
    frame.add(sp);
}