我正在嘗試使用 swing 在 java 上構建一個應用程式,用戶需要輸入一些產品并將它們存盤在一個陣列串列中,并在另一個 Jframe 中顯示表(JTable)上的產品串列,我遇到的問題是添加產品并單擊串列按鈕,該表不包含產品,即使 Arraylist 大小回傳 0
類產品
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 Inventory用戶可以輸入產品詳細資訊的 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 Inventory向用戶顯示產品詳細資訊的 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);
}
}
uj5u.com熱心網友回復:
如果您希望您的班級Liste訪問班級,您有幾種可能性。listProduitInventory
按照我的首選順序:
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);
}
Inventory n類中的欄位Liste不是必需的。
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一個靜態欄位
這只是為了完整性。您應該盡可能少地創建靜態欄位 - 靜態欄位是一種懶惰的“解決方案”,如果您的程式增長,它可能會產生大問題,并且從這種方法更改為更好的方法(最好是第一種方法)會變得越來越難,因為您擁有的代碼越多依賴于靜態欄位。
在類Inventory中更改欄位的宣告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 回圈或使用介面的forEach()方法來進一步改進建構式List。
使用增強的 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);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/462465.html
