水果超市管理系统
1.任务描述
- 在水果超市中,有着各种各样的水果,为了便于管理,会将水果信息记录在水果超市管理系统中进行统一管理,通过系统可以方便地实现对水果信息的增删改查操作。其中,水果信息包括水果编号、水果名称、水果单价和计价单位等。本任务要求使用所学GUI知识,编写一个水果超市管理系统;
- 水果超市管理系统共包括系统欢迎界面和超市货物管理界面两个界面在系统欢迎界面通过单击“进入系统”按钮,进入超市货物管理界面,在货物管理界面就可以对水果信息实现具体的操作。例如:每当有新水果运送到超市时,就需要系统管理人员在系统中增加新水果的信息,如果超市中的水果没有了就删除该水果信息,或者数量价格等需要变更时进行修改,这些操作都可以在管理系统中完成。
2. 运行结果
- 首页
2. 进入系统后
3.实现代码
Login.java
package GreenGrocer;
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Login extends JFrame implements ActionListener {
private JButton jButton;
public static void main(String[] args) {
// TODO Auto-generated method stub
Login frame = new Login();
}
public Login() {
JPanel jPanel = new JPanel(new BorderLayout());
setSize(600, 400);
this.setTitle("水果超市欢迎您!");
this.setLocation(300, 400);
jButton = new JButton("登入系统");
JavaJF javaJF = new JavaJF();
jPanel.add(javaJF, BorderLayout.CENTER);
jPanel.add(jButton, BorderLayout.SOUTH);
jButton.addActionListener(this);// 加入事件监听
this.setVisible(true);
add(jPanel);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if (e.getSource() == jButton) {
this.dispose();// 点击时发生事件
// new FruitManage();
FruitManage fruitManage = new FruitManage();
fruitManage.setBounds(0, 0, 800, 800);
fruitManage.setTitle("水果店");
Police police = new Police();
fruitManage.setMyComamdListener(police);
}
}
}
class JavaJF extends JPanel {
Image image;
public void paint(Graphics g) {
try {
image = ImageIO.read(new File("D:\\mywork\\Java高级 实验4" + "\\src\\GreenGrocer\\login.png"));
g.drawImage(image, 0, 0, 580, 350, null);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
Police .java
package GreenGrocer;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
public class Police extends MouseAdapter implements MyComamdListener {
JTextField jTextField[];
JTable jTable;
JButton jButton[];
JComboBox jComboBox[];// 复选
JPanel jPanel;
JScrollPane jScrollPane;
DefaultTableModel defaultTableModel;
FruitDAO fruitDAO;
int selectedRow;
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
Fruit fruit;
if (e.getActionCommand().equals("添加水果")) {
fruit = new Fruit();
// jPanel.getForeground();
if (!fruitDAO.isExist(jTextField[0].getText())) {
try {
String[] rowValues = { jTextField[0].getText(), jTextField[1].getText(), jTextField[2].getText(),
jComboBox[0].getSelectedItem() + "" };
fruit.setNoString(rowValues[0]);
fruit.setNameString(rowValues[1]);
fruit.setPer_Price(Double.parseDouble(rowValues[2]));
fruit.setUnit(rowValues[3]);
defaultTableModel.addRow(rowValues);
fruitDAO.addFruit(fruit);
for (int i = 0; i < 3; i++) {
jTextField[i].setText("");
}
jTable.repaint();// 刷新
} catch (Exception exception) {
}
} else {
JOptionPane.showMessageDialog(null, "该编号存在", "消息重新输入", JOptionPane.WARNING_MESSAGE);
jTextField[0].setText("");
}
}
if (e.getActionCommand().equals("修改水果")) {
fruit = new Fruit();
// jPanel.getForeground();
if (fruitDAO.isExist(jTextField[3].getText())) {
try {
selectedRow = jTable.getSelectedRow();
// fruit.setNoString(jTextField[3].getText());
fruit.setNameString(jTextField[4].getText());
fruit.setPer_Price(Double.parseDouble(jTextField[5].getText()));
fruit.setUnit(jComboBox[1].getSelectedItem() + "");
fruitDAO.updateFruit(fruit);
jTextField[3].setText("");
for (int i = 4; i < 6; i++) {
defaultTableModel.setValueAt(jTextField[i].getText(), selectedRow, i - 3);
jTextField[i].setText("");
}
defaultTableModel.setValueAt(jComboBox[1].getSelectedItem(), selectedRow, 3);
jTable.repaint();// 刷锟斤拷
} catch (Exception exception) {
}
} else {
JOptionPane.showMessageDialog(null, "该编号不存在,无法修改", "消息", JOptionPane.WARNING_MESSAGE);
// jTextField[0].setText("");
}
jTextField[3].setText("");
jTextField[4].setText("");
jTextField[5].setText("");
}
if (e.getActionCommand().equals("删除水果")) {
selectedRow = jTable.getSelectedRow();
if (fruitDAO.isExist(jTextField[6].getText()) && selectedRow != -1) {
fruit = new Fruit();
fruit.setNoString(jTextField[6].getText());
for (int i = 0; i < fruitDAO.arrayList.size(); i++) {
if (fruitDAO.arrayList.get(i).noString.equals(jTextField[6].getText())) {
fruitDAO.arrayList.remove(i);
jTextField[6].setText(fruit.getNoString());
}
}
defaultTableModel.removeRow(selectedRow);
} else {
JOptionPane.showMessageDialog(null, "该编号不存在", "消息", JOptionPane.WARNING_MESSAGE);
}
jTextField[6].setText("");
}
}
@Override
public void mouseClicked(MouseEvent e) {
if (e.getSource() == jScrollPane) {
// 取消掉选择框
jTable.clearSelection();
}
if (e.getSource() == jTable) {
selectedRow = jTable.getSelectedRow();
Object one = defaultTableModel.getValueAt(selectedRow, 0);
Object two = defaultTableModel.getValueAt(selectedRow, 1);
Object there = defaultTableModel.getValueAt(selectedRow, 2);
Object four = defaultTableModel.getValueAt(selectedRow, 3);
jTextField[3].setText(one.toString());
jTextField[4].setText(two.toString());
jTextField[5].setText(there.toString());
jComboBox[1].setSelectedItem(four.toString());
jTextField[6].setText(one.toString());
}
}
@Override
public void setJScrollPane(JScrollPane jScrollPane) {
// TODO Auto-generated method stub
this.jScrollPane = jScrollPane;
}
@Override
public void setJTextField(JTextField[] textField) {
// TODO Auto-generated method stub
jTextField = textField;
}
@Override
public void setJComboBox(JComboBox[] jComboBox) {
// TODO Auto-generated method stub
this.jComboBox = jComboBox;
}
@Override
public void setJTable(JTable jTable) {
// TODO Auto-generated method stub
this.jTable = jTable;
}
@Override
public void setButter(JButton[] jButton) {
// TODO Auto-generated method stub
this.jButton = jButton;
}
@Override
public void setJPanel(JPanel jPanel) {
// TODO Auto-generated method stub
this.jPanel = jPanel;
}
@Override
public void setDefaultTableModel(DefaultTableModel defaultTableModel) {
// TODO Auto-generated method stub
this.defaultTableModel = defaultTableModel;
}
@Override
public void setFruitDAO(FruitDAO fruitDAO) {
// TODO Auto-generated method stub
this.fruitDAO = fruitDAO;
}
}
MyComamdListener .java
package GreenGrocer;
import java.awt.event.ActionListener;
import java.awt.event.MouseListener;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
public interface MyComamdListener extends ActionListener, MouseListener {
public void setJTextField(JTextField[] textField);
public void setJComboBox(JComboBox[] jComboBox);
public void setJTable(JTable table);
public void setButter(JButton[] jButtons);
public void setJPanel(JPanel jPanel);
public void setJScrollPane(JScrollPane jScrollPane);
public void setDefaultTableModel(DefaultTableModel defaultTableModel);
public void setFruitDAO(FruitDAO fruitDAO);
}
FruitManage.java
package GreenGrocer;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.table.DefaultTableModel;
public class FruitManage extends JFrame {
// JFrame jFrame;
JTextField jTextField[];
JComboBox[] jComboBox;//
JScrollPane scrollPane;
JTable jTabel;
JLabel titleJLabel;
FruitDAO fruitDAO;
Fruit fruit;
DefaultTableModel defaultTableModel;
JLabel flagLabel[];
JButton jButton[];
JPanel jPanel_left;
MyComamdListener listener;
public FruitManage() {
initalize();
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// TODO Auto-generated constructor stub
}
void initalize() { //
setSize(900, 700);
setTitle("水果管理系统:");
Object name[] = { "编号", "名称", "单价(元)", "重量" };
Object unit[] = { "g", "kg", "5kg", "10kg" };
jTabel = new JTable();
fruitDAO = new FruitDAO();
scrollPane = new JScrollPane();
jTabel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
// 锟斤拷选
jTextField = new JTextField[7];
flagLabel = new JLabel[4];
GridBagLayout layout = new GridBagLayout();
GridBagConstraints s = new GridBagConstraints();// 锟斤拷锟斤拷一锟斤拷GridBagConstraints锟斤拷
this.setLayout(layout);
String default_fruitManage[][] = { { "1", "苹果", "5.0", "kg" }, { "2", "香蕉", "25.0", "kg" } };
for (int i = 0; i < default_fruitManage.length; i++) {
fruit = new Fruit();
fruit.setNoString(default_fruitManage[i][0]);
fruit.setNameString(default_fruitManage[i][1]);
fruit.setPer_Price(Double.parseDouble(default_fruitManage[i][2]));
fruit.setUnit(default_fruitManage[i][3]);
fruitDAO.arrayList.add(fruit);
}
Vector<String> columnNames = new Vector<>();
columnNames.add(name[0].toString());
columnNames.add(name[1].toString());
columnNames.add(name[2].toString());
columnNames.add(name[3].toString());
Vector<Vector<String>> jTable_Vector = new Vector<>();
for (int i = 0; i < fruitDAO.arrayList.size(); i++) {
Vector<String> voVector = new Vector<>();
voVector.add(fruitDAO.arrayList.get(i).getNoString());
voVector.add(fruitDAO.arrayList.get(i).getNameString());
voVector.add(fruitDAO.arrayList.get(i).getPer_Price() + "");
voVector.add(fruitDAO.arrayList.get(i).getUnit());
jTable_Vector.add(voVector);
}
defaultTableModel = new DefaultTableModel(jTable_Vector, columnNames);
jTabel.setModel(defaultTableModel);
scrollPane.setViewportView(jTabel);
JPanel jPanel_title = new JPanel();
titleJLabel = new JLabel();
titleJLabel.setText("水果店");
jPanel_title.add(titleJLabel);
s.gridwidth = 0;
s.gridheight = 1;
s.weightx = 0;
s.weighty = 0;
layout.setConstraints(jPanel_title, s);
add(jPanel_title);
JPanel jPanel_Table = new JPanel();
jPanel_Table.setPreferredSize(new Dimension(100, 100));
jPanel_Table.add(scrollPane);
// add(jPanel_Table, BorderLayout.CENTER);
s.gridwidth = 0;
s.gridheight = 3;
s.weightx = 0;
s.weighty = 0;
s.ipadx = 400;
s.ipady = 300;
layout.setConstraints(jPanel_Table, s);
add(jPanel_Table);
JPanel jPanel_South = new JPanel(layout);
JPanel jPanel = new JPanel();
s.gridwidth = 1;
s.gridheight = 1;
s.weightx = 0;
s.weighty = 0;
s.ipadx = 0;
s.ipady = 0;
s.insets = new Insets(5, 10, 2, 10);
for (int i = 0; i < flagLabel.length; i++) {
flagLabel[i] = new JLabel();
flagLabel[i].setText(String.valueOf(name[i]));
layout.setConstraints(flagLabel[i], s);
}
for (int i = 0; i < jTextField.length; i++) {
jTextField[i] = new JTextField(5);
layout.setConstraints(jTextField[i], s);
}
jComboBox = new JComboBox[2];
jComboBox[1] = new JComboBox(unit);
layout.setConstraints(jComboBox[1], s);
jComboBox[0] = new JComboBox(unit);
layout.setConstraints(jComboBox[0], s);
// add(jPanel_left, BorderLayout.SOUTH);
jButton = new JButton[3];
s.gridwidth = 0;
layout.setConstraints(jPanel, s);
jButton[0] = new JButton("添加水果");
layout.setConstraints(jButton[0], s);
jButton[1] = new JButton("修改水果");
layout.setConstraints(jButton[1], s);
jButton[2] = new JButton("删除水果");
layout.setConstraints(jButton[2], s);
for (int i = 0; i < flagLabel.length; i++) {
jPanel_South.add(flagLabel[i]);
}
jPanel_South.add(jPanel);
for (int i = 0; i < 2; i++) {
if (i == 0) {
jPanel_South.add(jTextField[i]);
jPanel_South.add(jTextField[i + 1]);
jPanel_South.add(jTextField[i + 2]);
}
if (i == 1) {
jPanel_South.add(jTextField[i + 2]);
jPanel_South.add(jTextField[i + 3]);
jPanel_South.add(jTextField[i + 4]);
}
jPanel_South.add(jComboBox[i]);
jPanel_South.add(jButton[i]);
}
jPanel_South.add(jTextField[6]);
JPanel jPanel2 = new JPanel();
s.gridwidth = 4;
layout.setConstraints(jPanel2, s);
jPanel_South.add(jPanel2);
jPanel_South.add(jButton[2]);
layout.setConstraints(jPanel_South, s);
add(jPanel_South);
// add(jPanel_South, BorderLayout.SOUTH);
}
void setMyComamdListener(MyComamdListener listener) {
this.listener = listener;
listener.setButter(jButton);
listener.setJTable(jTabel);
listener.setJTextField(jTextField);
listener.setJComboBox(jComboBox);
listener.setJPanel(jPanel_left);
listener.setJScrollPane(scrollPane);
listener.setDefaultTableModel(defaultTableModel);
listener.setFruitDAO(fruitDAO);
scrollPane.addMouseListener(listener);
jTabel.addMouseListener(listener);
for (int i = 0; i < jButton.length; i++) {
jButton[i].addActionListener(listener);
}
for (int i = 0; i < jComboBox.length; i++) {
jComboBox[i].addActionListener(listener);
}
for (int i = 0; i < jTextField.length; i++) {
jTextField[i].addActionListener(listener);
}
}
}
FruitDAO.java
package GreenGrocer;
import java.util.ArrayList;
public class FruitDAO {
ArrayList<Fruit> arrayList = new ArrayList<Fruit>();
public FruitDAO() {
}
public void addFruit(Fruit fruit) {
arrayList.add(fruit);
}
public void updateFruit(Fruit fruit) {
for (int i = 0; i < arrayList.size(); i++) {
if (arrayList.get(i).noString.equals(fruit.noString)) {
arrayList.set(i, fruit);
}
}
}
public void deleteFruit(Fruit fruit) {
for (int i = 0; i < arrayList.size(); i++) {
if (arrayList.get(i).noString.equals(fruit.noString)) {
arrayList.remove(i);
}
}
}
public boolean isExist(String noString) {
for (int i = 0; i < arrayList.size(); i++) {
if (arrayList.get(i).getNoString().equals(noString)) {
return true;
}
}
return false;
}
}
Fruit.java
package GreenGrocer;
public class Fruit {
protected String nameString;
protected String noString;
protected double per_Price;
protected String unitString;
public String getNameString() {
return nameString;
}
public void setNameString(String nameString) {
this.nameString = nameString;
}
public String getNoString() {
return noString;
}
public void setNoString(String noString) {
this.noString = noString;
}
public double getPer_Price() {
return per_Price;
}
public void setPer_Price(double per_Price) {
this.per_Price = per_Price;
}
public String getUnit() {
return unitString;
}
public void setUnit(String unitString) {
this.unitString = unitString;
}
Fruit() {
}
Fruit(String nameString, String noString, double per_Price, String unitString) {
this.nameString = nameString;
this.noString = noString;
this.per_Price = per_Price;
this.unitString = unitString;
}
}
4.总结感悟
【错误总结】
a) 采用链表增加结点时,判断出重复项后再次添加该结点添加成功情况
b) 删除结点后在窗口表格中删除,但链表中得结点依旧存在
c) 修改节点时将结点编号改成已存在的结点出现修改成功现象
d) 采用网格布局时组件间无法设置间隔
e) 无法在登入界面显示图片
【错误分析及解决】:
a) 由于采用链表存放信息,采用循环遍历结点信息,当结点中的信息存在时,跳出提示框,但判断下次输入结点时,遍历未从头开始遍历。
b) 只更新窗口表格信息而未删除链表中的结点
c) 由编号不可更改的前提下,不将编号输入框信息返回值窗口表格以及链表中
d) 更换布局(GridBagLayout)设置组件间的间隔
e) 利用继承JPanel写painnt方法,该方法利用ImageIO类的read方法导入图片
【总结感悟】
a) 本次实验复习第五章继承的相关知识,第六章的接口的实现,第七章异常处理是一次比较全面的实验。通过复习面向接口编程使程序有更好的封装性
b) 熟悉掌握了GridBagLayout布局,该布局使组件有更好的可视性
c) 利用java中的Vector(数据集合)传参至JTable中,具有更加灵活的特性
d) 学习WindowAdapter适配器的用法,当触发事件接口有很多抽象方法时利用事件适配器重写需要使用的方法即可,而不需要实现接口中所有的方法
e) 了解MVC结构的使用,利用模型存储数据,利用视图为模型提供数据显示的对象,利用控制器处理用户的交互操作