1、学会分析“水果超市管理系统”任务的设计思路。
2、根据思路独立完成“水果超市管理系统”任务的源代码的编写、编译和运行。
3、掌握Swing工具中常用组件的使用。
在水果超市中,有着各种各样的水果,为了便于管理,会将水果信息记录在水果超市管理系统中进行统一管理,通过系统可以方便实现对水果信息的增删改查操作。其中,水果信息包括水果编号、名称、单价和计价单位等。本任务要求使用所学的GUI知识,编写一个水果超市管理系统。
水果超市管理系统共包括系统欢迎界面和超市货物管理界面两个界面,在系统欢迎界面通过单击“进入系统”按钮,进入超市货物管理界面,在货物管理界面就可以对水果信息实现具体的操作。例如:每当有新水果运送到超市的时候,就需要系统管理人员增加新水果的信息,如果超市中的水果没有了就删除水果信息,或者数量价格等需要变更时要进行修改,这些操作都可以在管理系统中完成。
二、实验原理(图):
1、系统欢迎窗口是一个窗体,可以通过JFrame组件来实现。该窗口主要分为2部分,一个是北区图片区,里面包含一张图片,另一个是正文区,包含要给“进入系统”的按钮。北区图片区可以放置在一个JLabel组件中,而按钮可以通过JButton组件实现。其中,“进入系统”按钮上需要添加一个监听器,单击时触发跳转到货物管理窗口的事件。可以定义一个继承自JFrame的抽象类,在类中定义方法,令其实现窗口中的组件和功能。
2、在完成系统欢迎窗口类定义后,可以定义一个测试类,在类中创建窗体对象并显示窗体,为了演示效果,单击“进入系统”按钮时,可以输出一句话。
3、超市欢迎窗口实现后,接下来需要实现超市货物管理窗口的界面展示。该窗口可以通过JDialog组件来实现,这里可以定义一个继承自JDialog的抽象类,在类中需要使用JTable组件创建表格来显示水果列表,表格可以放在JScrollPane组件中。在表格下方需要定义标签、文本框以及按钮组件。
4、当完成了货物管理窗口类的定义后,也可以定义一个测试类来查看显示结果。
5、当系统的两个窗口界面都能够显示出后,接下来就要实现两个窗口中的具体功能。由于弹出窗口的功能实现比较简单,这里可以先实现货物管理的窗口中增删改的功能。水果信息中包含编号、名称等信息,所以可以定义一个类,来专门封装水果信息。
6、在添加水果信息时,所添加的数据可以存储在集合中,所以可以定义一个用于存储数据的类,类中使用集合来存储数据。
7、有了存储数据功能的类后,就需要实现在货物管理窗口中对水果数据的查询、添加和删除等操作。这里可以将实现这些操作的类通过包来分为3层,这3层分别用于存储数据操作的类、存放实现业务逻辑的服务类和实现管理员操作的控制类。
8、实现了货物管理窗口中的功能后,接下来就可以实现单击“进入系统”按钮后,弹出货物管理界面功能了,此处可以创建一个类来处理单击按钮的监听事件。
9、最后定义主方法,运行程序并输入数据进行测试。
import java.awt.Window;
public class MainApp {
public static void main(String[] args) {
new MainFrameController().setVisible(true);}}
import java.util.ArrayList;
import javax.xml.crypto.Data;
public class AdminDao {
// 获取所有数据
public ArrayList<FruitItem> queryAllData() {
return DataBase.data;}
// 添加数据
public void addFruitItem(FruitItem fruitItem) {
DataBase.data.add(fruitItem);
}
// 删除数据
public void delFruitItem(String delNumber) {
// 查询集合中数据
for (int i = 0; i < DataBase.data.size(); i++) {
FruitItem thisFruitItem = DataBase.data.get(i);
// 如果有水果项的编号与传入编号相同,则从集合中删除
if (thisFruitItem.getNumber().equals(delNumber)) {
DataBase.data.remove(i);
} } }}
public class MainFrameController extends AbstractMainFrame {
public void showAdminDialog() {
//在该方法中创建管理员界面并显示
//this为父窗口(主界面)true,设置为模态窗口展示
new AdminDialogController(this,true).setVisible(true); }}
import java.util.ArrayList;
public class DataBase {//模拟数据库
public static ArrayList<FruitItem> data=new ArrayList<FruitItem>();
static {//添加模拟数据苹果
data.add(new FruitItem("1","苹果",5.0,"kg")); }}
GUI工具类:
package 第五次水果超市;
import java.awt.Component;
import java.awt.Toolkit;
import javax.swing.JFrame;
public class GUITools {
// JAVA提供的GUI默认工具类对象
static Toolkit kit = Toolkit.getDefaultToolkit();
// 将指定的组件屏幕居中
public static void center(Component c) {
int x = (kit.getScreenSize().width - c.getWidth()) / 2;
int y = (kit.getScreenSize().height - c.getHeight()) / 2;
c.setLocation(x, y);}
//为指定的窗口设定标题
public static void setTitleImage(JFrame frame,String titleIconPath) {
frame.setIconImage(kit.createImage(titleIconPath));
}}
import java.awt.BorderLayout;
public abstract class AbstractMainFrame extends JFrame{
private JLabel titleLabel=new JLabel(new ImageIcon("FruitStore.jpg"));//组件
private JButton btn=new JButton("进入系统");//顾客按钮
//构造方法
public AbstractMainFrame() {
this.init();//窗体的初始化操作
this.addComponent();//添加组件
this.addListener();//添加监听器}
//初始化
private void init() {
this.setTitle("水果超市欢迎您!");
this.setSize(600,450);
GUITools.center(this);
GUITools.setTitleImage(this,"src/images/title.png");
this.setResizable(false);//窗体大小固定
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}
//添加组件
private void addComponent() {
//窗体使用默认的边界布局,北区放入图片
this.add(this.titleLabel,BorderLayout.NORTH);
//创建JPanel对象
JPanel btnPanel=new JPanel();
//清楚布局,使得JPanel中的组件可以自定义位置
btnPanel.setLayout(null);
//将JPanel对象添加到窗体中
this.add(btnPanel);//将JPanel对象添加到窗体中
//定义边界位置
btn.setBounds(240,20,120,50);
//将按钮添加到JPanel对象中
btnPanel.add(btn); }
//添加监听器
private void addListener() {
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
showAdminDialog();}
});}
//展示管理员界面
public abstract void showAdminDialog(); }
import java.util.ArrayList;
public class AdminService {
private AdminDao adminDao =new AdminDao();
//查询服务
public ArrayList<FruitItem> queryFruitItem(){
ArrayList<FruitItem> data=adminDao.queryAllData();
return data;}
//添加服务
public boolean addFruitItem(String number,String name,String price,String unit)
{//调用Dao层的获取所有数据方法获取所有数据
ArrayList<FruitItem> data=queryFruitItem();
//使用输入的编号与所有数据对比
for(int i=0;i<data.size();i++)
{
FruitItem fruitItem =data.get(i);
//如果存在重复编号数据,则添加不成功
if(number.equals(fruitItem.getNumber()))
{ return false; }
}
//如果没有重复的编号,将数据封装在FruitItem对象
FruitItem thisFruitItem=new FruitItem(number,name,Double.parseDouble(price), unit);
//调用Dao层的添加数据方法
adminDao.addFruitItem(thisFruitItem);
//在添加数据后,返回添加成功
return true; }
//修改服务
public boolean updateFruitItem(String number,String name,String price,String unit)
{ //调用Dao层的获取所有数据方法获取所有数据
ArrayList<FruitItem> data=queryFruitItem();
//使用输入的编号与所有数据比
for(int i=0;i<data.size();i++)
{ FruitItem fruititem=data.get(i);
//如果存在相同编号数据,则可以更新
if(number.equals(fruititem.getNumber())) {
//调用Dao层的删除指定编号数据方法
adminDao.delFruitItem(number);
//如果没有重复编号,将数据封装为FruitItem对象
FruitItem thisFruitItem=new FruitItem(number,name,Double.parseDouble(price),unit);
//调用Dao层的添加数据方法
adminDao.addFruitItem(thisFruitItem);
//在修改数据后,返回添加成功
return true;}}
//如果不存在相同编号数据,则不可以更新
return false;}
//删除服务
public boolean delFruitItem(String delNumber) {
//调用Dao层的获取所有数据方法获取所有数据
ArrayList<FruitItem> data=queryFruitItem();
//使用输入的编号与所有数据对比
for(int i=0;i<data.size();i++)
{ FruitItem fruitItem=data.get(i);
//如果存在相同编号数据,则可以删除
if(delNumber.equals(fruitItem.getNumber())) {
//调用Dao层的删除指定编号数据方法
adminDao.delFruitItem(delNumber);
//在删除数据后,返回添加成功
return true; }}
//如果不存在相同编号的数据,则不可以删除
return false; }}
import java.awt.Frame;
public class AdminDialogController extends AbstractAdminDialog {
//定义服务类,提供完整功能服务
private AdminService adminService=new AdminService();
//构造方法
public AdminDialogController() {
queryFruitItem();
}
public AdminDialogController(Frame owner,boolean modal) {
super(owner,modal);
//创建对象时展示数据
queryFruitItem();}
//查询方法
public void queryFruitItem() {
//定义表格头
String[] thead=new String[] {"水果编号","水果名称","水果单价(/元)","计价单位"};
//调用adminService的查询服务
ArrayList<FruitItem> dataList=adminService.queryFruitItem();
//调用list2Array方法,将查询到的集合转为数组,方便为JTable赋值
String[][] tbody=list2Array(dataList);
//将查询到的结果为table赋值
TableModel data =new DefaultTableModel(tbody,thead);
table.setModel(data); }
//集合数据转为二维数组方法
public String[][] list2Array(ArrayList<FruitItem> list){
//根据FruitItem的model与集合数据定义JTable的数据二维数组
String[][]tbody=new String[list.size()][4];
for(int i=0;i<list.size();i++)
{
FruitItem fruitItem=list.get(i);
tbody[i][0]=fruitItem.getNumber();
tbody[i][1]=fruitItem.getName();
tbody[i][2]=fruitItem.getPrice()+"";
tbody[i][3]=fruitItem.getUnit();
}
return tbody;
}
//添加方法
public void addFruitItem() {
//获取数据
String addNumber=addNumberText.getText();
String addName=addNameText.getText();
String addPrice=addPriceText.getText();
String addUnit=addUnitText.getText();
//调用adminService的添加服务
boolean addSuccess=adminService.addFruitItem(addNumber,addName,addPrice,addUnit);
//如果添加成功
if(addSuccess) {
//添加后刷新表格
queryFruitItem();}
else
//没有添加成功弹窗错误提示
JOptionPane.showMessageDialog(this,"水果编号不能重复,请检查数据!");
}
//修改方法
public void updateFruitItem() {
//获取数据
String updateNumber=updateNumberText.getText();
String updateName=updateNameText.getText();
String updatePrice=updatePriceText.getText();
String updateUnit=updateUnitText.getText();
//调用adminService的添加服务
boolean updateSuccess=adminService.updateFruitItem(updateNumber,updateName,updatePrice,updateUnit);
//如果修改成功
if(updateSuccess) {
//修改后刷新表格
queryFruitItem(); }
else
//没有修改成功弹窗错误提示
JOptionPane.showMessageDialog(this,"没有这个编号的水果,请检查数据!"); }
//删除方法
public void delFruitItem() {
//获取数据
String delNumber=delNumberText.getText();
//调用adminService的删除服务
boolean delSucess=adminService.delFruitItem(delNumber);
//如果删除成功
if(delSucess) {
//删除后刷新表格
queryFruitItem();
}
else
//没有删除工程则弹窗错误提示
JOptionPane.showMessageDialog(this, "没有这个编号的水果,请检查数据!");}}
//定义界面使用到的组件作为成员变量:
import java.awt.Frame;
public abstract class AbstractAdminDialog extends JDialog {
// 定义界面使用到的组件作为成员变量
private JLabel tableLabel = new JLabel("水果列表");// 水果列表标题
private JScrollPane tablePane = new JScrollPane();// 滚动视口
protected JTable table = new JTable();// 水果列表
private JLabel numberLabel = new JLabel("水果编号");// 编号标题
private JLabel nameLabel = new JLabel("水果名称");// 名称标题
private JLabel priceLabel = new JLabel("水果单价");// 单价标题
private JLabel unitLabel = new JLabel("计价单位");// 计价单位标题
// 添加功能组件
protected JTextField addNumberText = new JTextField(6);// 添加编号文本框
protected JTextField addNameText = new JTextField(6);// 添加名称文本框
protected JTextField addPriceText = new JTextField(6);// 添加单价文本框
protected JTextField addUnitText = new JTextField(6);// 添加计价单位文本框
private JButton addBtn = new JButton("添加水果");// 添加按钮
// 修改功能组件
protected JTextField updateNumberText = new JTextField(6);// 修改编号文本框
protected JTextField updateNameText = new JTextField(6);// 修改名称文本框
protected JTextField updatePriceText = new JTextField(6);// 修改单价文本框
protected JTextField updateUnitText = new JTextField(6);// 修改单位文本框
private JButton updateBtn = new JButton("修改水果");// 修改按钮
// 删除功能组件
protected JTextField delNumberText = new JTextField(6);// 添加删除编号
private JButton delBtn = new JButton("删除水果");// 删除按钮
// 构造方法
public AbstractAdminDialog() {
this(null, true);
}
public AbstractAdminDialog(Frame owner, boolean modal) {
super(owner, modal);
this.init();
this.addComponent();
this.addListener();
}
// 初始化操作
private void init() {
this.setTitle("超市货物管理");
this.setSize(600, 450);
GUITools.center(this);
this.setResizable(false);}
private void addComponent() {
this.setLayout(null); // 取消布局
tableLabel.setBounds(265, 20, 70, 25); // 表格标题
this.add(tableLabel); // 表格
table.getTableHeader().setReorderingAllowed(false);// 列不能移动
table.getTableHeader().setResizingAllowed(false);// 不可拉动表格
table.setEnabled(false);
tablePane.setBounds(50, 50, 500, 200);
tablePane.setViewportView(table);
this.add(tablePane);
// 字段标题
numberLabel.setBounds(50, 250, 70, 25);
nameLabel.setBounds(150, 250, 70, 25);
priceLabel.setBounds(250, 250, 70, 25);
unitLabel.setBounds(350, 250, 70, 25);
this.add(numberLabel);
this.add(nameLabel);
this.add(priceLabel);
this.add(unitLabel);
// 增加组件
// 修改组件
// 删除组件
// 添加监听器
// 修改监听器