public class Util { private static DecimalFormat formatTool=new DecimalFormat("#,###.00"); //将用户输入实数转化为字符串类型的货币值 public static String dollar(double num){ return "¥"+formatTool.format(num); } }
public class List { //定义数组可以包含对象的最大个数 private int maxItems=100; //该数组包含对象的实际个数 private int numItems=0; //定义该类中用来存储对象的数组 protected Object[] list=null; //类的构造方法 public List(){ //初始化数组 list=new Object[maxItems]; } //该构造方法,可以修改数组可以包含对象的最大个数 public List(int _maxItems){ maxItems=_maxItems; list=new Object[maxItems]; } public void add(Object obj){ //假定还有空间增加一个对象 list[numItems]=obj; numItems++; } public void delete(int pos){ //假设pos在0与numItems之间 for(int i=pos+1;i<numItems;i++){ list[i-1]=list[i]; } numItems--; } //检索数组中pos位置的对象 public Object get(int pos){ return list[pos]; } //返回数组中包含对象的个数 public int getSize(){ return numItems; } //判断数组是否满 public boolean isFull(){ return(numItems>=maxItems); } //以string形式返回list类 public String toString(){ String s=new String(); for(int i=0;i<numItems;i++){ s+="\n"+list[i].toString(); } return s+"\n"; } }
public interface Comparable { public abstract int compare(Object obj1,Object obj2); }
public class FlexSorter { //返回A[start],A[start+1]...A[stop-1]中最小元素的序号 private static int findMin(Object[] A,int start,int stop,Comparable comp){ int min=start; for(int i=start+1;i<stop;i++){ if(comp.compare(A[i], A[min])<0) min=i; } return min; } //交换A[pos1],WITH A[pos2] private static void swap(Object[] A,int pos1,int pos2){ Object temp=A[pos1]; A[pos1]=A[pos2]; A[pos2]=temp; } //选择排序算法 public static void sort(Object[] A,int stop,Comparable comp){ for(int i=0;i<stop;i++){ swap(A, i, findMin(A, i, stop, comp)); } } public static void sort(Object[] A,Comparable comp){ sort(A,A.length,comp); } }
public class SortedList extends List{ //排序时用来进行比较时的接口 private Comparable comp; //类的构造方法,以comparable为参数 public SortedList(Comparable _comp){ comp=_comp; } //类的构造方法,以可以存储对象的最大对象个数和_comp为参数 public SortedList(int _maxItems,Comparable _comp){ super(_maxItems); comp=_comp; } //向数组中添加一个对象的同时,对数组中的对象进行排序 public void add(Object obj){ super.add(obj); FlexSorter.sort(list, getSize(),comp); } //返回对象在数组中的位置否则返回-1 public int indexOf(Object obj){ for(int i=0;i<getSize();i++){ if(comp.compare(get(i),obj)==0) return i; } return -1; } }
public class Item { //条目的id desc protected String ID,desc; //条目的价格 protected double price; //此条目中商品的数量 protected int units; public Item(String _ID){ ID=_ID; } //返回条目的字符串表示形式 public String toString(){ return ID+"\t"+units+" units X"+Util.dollar(price)+"\t"; } }
public class InventoryItem extends Item{ public InventoryItem(String _ID,String _desc,double _price,int _units) { super(_ID); desc=_desc; price=_price; units=_units; } //在存货条目中减少商品的数量 public void remove(int num){ units-=num; } //在存货条目中增加商品数量 public void add(int num){ units+=num; } //以字符串形式返回存货条目的描述 public String toString(){ return super.toString()+"\t"+desc; } }
public class InvoiceItem extends Item{ //提货条目的构造方法,以相关的存货条目和提货数量为参数 public InvoiceItem(InventoryItem item,int _units) { super(item.ID); desc=item.desc; price=item.price; units=_units; total=price*units; } //定义提货清单中每个条目的价格 protected double total; //以字符串形式返回提货清单中的一条提货条目 public String toString(){ return super.toString()+"="+Util.dollar(total)+"\t("+desc+")"; } }
public class ItemComparer implements Comparable{ @Override public int compare(Object obj1, Object obj2) { if((obj1 instanceof Item)&&(obj2 instanceof Item)){ Item item1=(Item)obj1; Item item2=(Item)obj2; return item1.ID.compareTo(item2.ID); } else return -1; } }
public class Inventory extends SortedList{ //存货清单的构造函数 public Inventory(){ super(4,new ItemComparer()); add(new InventoryItem("0001", "电池", 2.30, 15)); add(new InventoryItem("0002", "彩电", 1280.00, 10)); add(new InventoryItem("0015", "电扇", 128.00, 10)); add(new InventoryItem("2001", "台灯", 32.00, 20)); } //根据用户输入的ID,返回相应的存货条目,如果不存在返回null public InventoryItem getPart(String _id){ int index=indexOf(new Item(_id)); if(index>=0) return (InventoryItem)get(index); else return null; } //在存货清单中,根据用户输入的id和用户输入的数量增加响应商品的数量 public void addUnits(String _id,int _number){ InventoryItem item=getPart(_id); if(item!=null) item.add(_number); else JOptionPane.showMessageDialog(null, "没有找到和输入ID对应的项","警告",JOptionPane.ERROR_MESSAGE); } //在存货清单中,根据用户输入的id和用户输入的数量减少相应商品的数量 public void removeUnits(String _id,int _number){ InventoryItem item=getPart(_id); if((item!=null)&&(item.units>=_number)&&(_number>=0)) item.remove(_number); else JOptionPane.showMessageDialog(null, "没有找到和输入ID对应的项","警告",JOptionPane.ERROR_MESSAGE); } }
public class Invoice extends SortedList { //定义与提货清单关联的存货清单 private Inventory inventory; //提货清单构造函数 public Invoice(Inventory _inventory){ super(new ItemComparer()); inventory=_inventory; } //在提货清单中增加提货条目,同时在存货清单中对应的存货条目上减少用户输入的商品数量 public void addItem(String _id,int _number){ InventoryItem item=inventory.getPart(_id); if((item!=null)&&(item.units>=_number)&&(_number>=0)&&!isFull()){ item.remove(_number); add(new InvoiceItem(item, _number)); }else{ JOptionPane.showMessageDialog(null, "列表满,项没有找到或者商品已经订购完","警告",JOptionPane.ERROR_MESSAGE);; System.out.println("List full,item not found ot invalid units"); } } //根据用户输入的id在提货清单上删除提货条目 public void delItem(String _id){ int index=indexOf(new Item(_id)); if(index>=0) delete(index); } //返回提货清单上商品的价格总和 public double getTotal(){ double total=0.0; for(int i=0;i<getSize();i++){ total+=((InvoiceItem)get(i)).total; } return total; } //以字符串形式返回提货清单 public String toString(){ return "提货清单"+Util.dollar(getTotal())+super.toString(); } }
public class MainFrame extends JFrame{ private Inventory inventory=new Inventory(); private Invoice invoice=new Invoice(inventory); final JTextArea textArea_1=new JTextArea();//显示存货单的信息 final JTextArea textArea_2=new JTextArea();//显示提货单的信息 public static void main(String args[]){ MainFrame frame=new MainFrame(); frame.setBounds(100,100,450,300); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } public MainFrame(){ super(); setTitle("商品库存管理系统"); final JTabbedPane tabbedPane=new JTabbedPane(); final JPanel panel_1=new JPanel(); final JPanel panel_2=new JPanel(); final JScrollPane scrollPane_1=new JScrollPane(textArea_1); final JScrollPane scrollPane_2=new JScrollPane(textArea_2); final JTextField id_1=new JTextField(4);//存货单某项的id final JTextField number_1=new JTextField(4);//欲修改的存货单的某项的数量 final JTextField id_2=new JTextField(4);//提货单的id final JTextField number_2=new JTextField(4);//欲修改的提货单的某项的数量 final JPanel panelButton_1=new JPanel(); final JPanel panelButton_2=new JPanel(); final JPanel panelInput_1=new JPanel(); final JPanel panelInput_2=new JPanel(); final JButton inventoryAddButton=new JButton(); final JButton inventoryRemoveButton=new JButton(); final JButton invoiceAddButton=new JButton(); final JButton invoiceDeleteButton=new JButton(); getContentPane().add(tabbedPane, BorderLayout.CENTER); tabbedPane.add("存货单",panel_1); tabbedPane.add("提货单",panel_2); panel_1.setLayout(new BorderLayout()); panel_1.add(scrollPane_1,BorderLayout.CENTER); panel_1.add(panelButton_1, BorderLayout.SOUTH); panel_1.add(panelInput_1, BorderLayout.NORTH); panelInput_1.add(new JLabel("存货单某项的id:")); panelInput_1.add(id_1); panelInput_1.add(new JLabel("商品数量:")); panelInput_1.add(number_1); panelButton_1.add(inventoryAddButton); inventoryAddButton.setText("增加商品数量"); panelButton_1.add(inventoryRemoveButton); inventoryRemoveButton.setText("减少商品数量"); textArea_1.setEditable(false); scrollPane_1.setViewportView(textArea_1); panel_2.setLayout(new BorderLayout()); panel_2.add(scrollPane_2,BorderLayout.CENTER); panel_2.add(panelButton_2, BorderLayout.SOUTH); panel_2.add(panelInput_2, BorderLayout.NORTH); panelInput_2.add(new JLabel("提货单某项的id:")); panelInput_2.add(id_2); panelInput_2.add(new JLabel("商品数量:")); panelInput_2.add(number_2); panelButton_2.add(invoiceAddButton); invoiceAddButton.setText("增加提货单"); panelButton_2.add(invoiceDeleteButton); invoiceDeleteButton.setText("删除提货单"); textArea_2.setEditable(false); scrollPane_2.setViewportView(textArea_2); refreshInventory(); refreshInvoice(); inventoryAddButton.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { try{ inventory.addUnits(id_1.getText(),Integer.parseInt(number_1.getText())); id_1.setText(null); number_1.setText(null); }catch(NumberFormatException e1){ JOptionPane.showMessageDialog(null, "输入的商品数量错误","警告",JOptionPane.ERROR_MESSAGE); } refreshInventory(); } }); inventoryRemoveButton.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { try{ inventory.removeUnits(id_1.getText(),Integer.parseInt(number_1.getText())); id_1.setText(null); number_1.setText(null); }catch(NumberFormatException e1){ JOptionPane.showMessageDialog(null, "输入的商品数量错误","警告",JOptionPane.ERROR_MESSAGE); } refreshInventory(); } }); invoiceAddButton.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { try{ invoice.addItem(id_2.getText(),Integer.parseInt(number_2.getText())); id_2.setText(null); number_2.setText(null); }catch(NumberFormatException e1){ JOptionPane.showMessageDialog(null, "输入的商品数量错误","警告",JOptionPane.ERROR_MESSAGE); } refreshInventory(); refreshInvoice(); } }); invoiceDeleteButton.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { invoice.delItem(id_2.getText()); id_2.setText(null); number_2.setText(null); refreshInvoice(); } }); } //刷新存货单的显示结果 public void refreshInventory(){ String str=null; for(int i=0;i<inventory.list.length;i++){ str=inventory.toString()+"\n"; } textArea_1.setText(str); } //刷新提货单的显示结果 public void refreshInvoice(){ String str=null; for(int i=0;i<invoice.list.length;i++){ str=invoice.toString()+"\n"; } textArea_2.setText(str); } }