案例介绍:
水果超市管理系统包括两个界面:系统欢迎界面和超市货物管理界面,在系统欢迎界面中,通过单击“进入系统”按钮,进入超市货物管理界面。在超市货物管理界面中,可以对水果信息实现具体的操作。例如,每当有新水果运送到超市时,就需要系统管理人员在系统中增加新水果的信息;若超市中的某种水果售罄,则删除该水果的信息;若水果的数量、价格等需要变更,则及时进行修改。这些操作都可以在水果超市管理系统中完成。
案例目标: 实现添加数据、修改数据和删除数据的功能。
运行环境: Jdk、Eclipse
案例代码:
首先,我们需要按照以下形式在Eclipse中创建相应的包和类。
先创建一个工程"fruitstore",下面开始就是代码了。
(1)先创建cn.example.fruitstore.app包,在此包下创建MainApp.java类。
package cn.example.fruitstore.app;
import cn.example.fruitstore.controller.MainFrameController;
/**
* 项目运行
*/
public class MainApp {
public static void main(String[] args) {
new MainFrameController().setVisible(true);
}
}
(2)先创建cn.example.fruitstore.controller包,在此包下创建AdminDialogController.java类和MainFrameController.java类。
//AdminDialogController.java类代码如下
package cn.example.fruitstore.controller;
import java.awt.Frame;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import cn.example.fruitstore.domain.FruitItem;
import cn.example.fruitstore.service.AdminService;
import cn.example.fruitstore.view.AbstractSdminDialog;
/**
* 管理员界面操作类*/
@SuppressWarnings("serial")
public class AdminDialogController extends AbstractSdminDialog{
//定义服务类,提供完整功能服务
private AdminService adminService = new AdminService();
//构造方法
public AdminDialogController(){
super();
}
public AdminDialogController(Frame owner,boolean modal) {
super(owner, modal);
//创建对象时展示数据
queryFruitItem();
}
//查询方法
@Override
public void queryFruitItem(){
//定义表格头
String[] thead ={"水果编号", "水果名称", "水果单价(/元)","计价单位"};
//调用adminService的查询服务
ArrayList<FruitItem> dataList = adminService.queryFruitItem();
//调用list2Array方法,将查询到的集合转换为数组,方便为JTable赋值
String[][] tbody = list2Array(dataList);
//用查询到的结果为table赋值
TableModel dataModel = new DefaultTableModel(tbody, thead);
table.setModel (dataModel);
}
//集合数据转换为二维数组方法
public String[][] list2Array(ArrayList<FruitItem> list){
//根据EruitItem类的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;
}
//添加方法
@Override
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,"水果编号不能重复,请检查数据!");
}
}
//修改方法
@Override
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,"没有这个编号的水果,请检查数据!");
}
}
//删除方法
@Override
public void delFruitItem(){
//获取数据
String delNumber = delNumberText.getText();
//调用 adminService的删除服务
boolean delSuccess = adminService.delFruitItem(delNumber) ;
//若删除成功
if(delSuccess){
//删除后刷新表格
queryFruitItem();
}else{
//若没有删除成功,则弹出错误提示
JOptionPane.showMessageDialog(this,"没有这个编号的水果,请检查数据! ");
}
}
}
//MainFrameController.java类代码如下
package cn.example.fruitstore.controller;
import cn.example.fruitstore.view.AbstractMainFrame;
/**
*主界面操作类
*/
@SuppressWarnings("serial")
public class MainFrameController extends AbstractMainFrame {
@Override
public void showAdminDialog(){
//在该方法中创建管理员界面并显示
// this为父窗体(主界面),true表示设置为模态窗体展示
new AdminDialogController(this, true).setVisible(true);
}
}
(3)先创建cn.example.fruitstore.dao包,在此包下创建AdminDao.java类。
package cn.example.fruitstore.dao;
import java.util.ArrayList;
import cn.example.fruitstore.data.DataBase;
import cn.example.fruitstore.domain.FruitItem;
/*
*管理员数据访问类
*/
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);
}
}
}
}
(4)先创建cn.example.fruitstore.data包,在此包下创建DataBase.java类。
package cn.example.fruitstore.data;
import java.util.ArrayList;
import cn.example.fruitstore.domain.FruitItem;
/**
* 存储数据
*/
public class DataBase{
public static ArrayList<FruitItem> data = new ArrayList<FruitItem>();
//初始数据
static{
data.add(new FruitItem("1","苹果",5.0,"kg"));
}
}
(5)先创建cn.example.fruitstore.domain包,在此包下创建FruitItem.java类。
package cn.example.fruitstore.domain;
/*
* 水果项数据模型
*/
public class FruitItem {
//属性
private String number; //水果编号
private String name; //水果名称
private double price;//水果单价
private String unit;//计价单位
//构造方法
public FruitItem(){
}
//存储数据
public FruitItem(String number, String name,double price,String unit) {
super();
this.number = number;
this.name = name;
this.price = price;
this.unit = unit;
}
// getter和 setter方法
public String getNumber() {
return number;
}
public void setNumber(String number) {
this. number = number;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public double getPrice(){
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getUnit() {
return unit;
}
public void setUnit(String unit) {
this.unit = unit;
}
}
(6)先创建cn.example.fruitstore.service包,在此包下创建AdminService.java类。
package cn.example.fruitstore.service;
import java.util.ArrayList;
import cn.example.fruitstore.dao.AdminDao;
import cn.example.fruitstore.domain.FruitItem;
/* *管理员服务类
*/
public class AdminService{
private AdminDao adminDao = new AdminDao();
//查询服务
public ArrayList<FruitItem> queryFruitItem(){
//调用Dao层的获取所有数据方法获取所有数据
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;
}
}
(7)先创建cn.example.fruitstore.test包,在此包下创建AbstractAdminDialogTest.java类和AbstractMainFrameTest.java类。
//AbstractAdminDialogTest.java类代码如下
package cn.example.fruitstore.test;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import cn.example.fruitstore.view.AbstractSdminDialog;
/*管理界面测试类*/
@SuppressWarnings("serial")
public class AbstractAdminDialogTest extends AbstractSdminDialog{
//定义构造方法初始化数据
public AbstractAdminDialogTest(){
super();
queryFruitItem();//测试数据
}
//加入测试table数据
@Override
public void queryFruitItem(){
String [] thead = new String []{ "水果编号", "水果名称",
"水果单价(/元)","计价单位"};
String[][] tbody = new String[][]{
{"1","苹果","5.0", "kg"},
{"2","葡萄","3.2","斤"},
{"3","雪梨","3.8","斤"},
{"4","大榴莲", "120","个"}
};
TableModel data = new DefaultTableModel(tbody, thead);
table.setModel(data);
}
@Override
public void addFruitItem(){
}
@Override
public void updateFruitItem(){
}
@Override
public void delFruitItem(){
}
public static void main(String[] args) {
new AbstractAdminDialogTest().setVisible(true);
}
}
//AbstractMainFrameTest.java类代码如下
package cn.example.fruitstore.test;
import cn.example.fruitstore.view.AbstractMainFrame;
/*主窗体测试类*/
@SuppressWarnings("serial")
public class AbstractMainFrameTest extends AbstractMainFrame {
//定义主函数
public static void main(String[] args){
new AbstractMainFrameTest().setVisible(true);
}
//覆盖父类中展示管理员界面的方法
@Override
public void showAdminDialog(){
System.out.println("进入管理界面");
}
}
(8)先创建cn.example.fruitstore.tools包,在此包下创建GUITools.java类。
package cn.example.fruitstore.tools;
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));
}
}
(9)先创建cn.example.fruitstore.view包,在此包下创建AbstractMainFrame.java类和AbstractSdminDialog.java类。然后我们需要在src所在的文件夹内存入一个“Fruaitstore.jpg”(任意图片都行,但是敲黑板:必须把“Fruaitstore.jpg”存放在src所在文件夹内,否则图片不会运行出来!)
我就把“FruitStore.jpg”放在了这里:
下面是AbstractMainFrame.java类和AbstractSdminDialog.java类的代码:
//AbstractMainFrame.java类代码如下
package cn.example.fruitstore.view;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import cn.example.fruitstore.tools.GUITools;
/**
*主窗体类
*/
@SuppressWarnings ("serial")
public abstract class AbstractMainFrame extends JFrame{//组件
private JLabel titleLabel = new JLabel(new ImageIcon("Fruaitstore.jpg"));//标题图片
private JButton btn = new JButton("进入系统");//按钮
//构造方法
public AbstractMainFrame(){
this.init ();
this.addComponent();//添加组件
this.addListener();//添加监听器
}
//初始化操作
private void init(){
this.setTitle("水果超市欢迎您!");
this.setSize(600,400);//窗体大小与位置
this.setResizable(true);//窗体大小不固定
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);
//定义边界位置
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();
}
//AbstractSdminDialog.java类代码如下
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import cn.example.fruitstore.tools.GUITools;
/*管理窗体类
*/
@SuppressWarnings("serial")
public abstract class AbstractSdminDialog 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 AbstractSdminDialog(){
this(null,true);
}
public AbstractSdminDialog (Frame owner, boolean modal){
super(owner,modal);
this.init();//初始化操作
this.addComponent();//添加组件
this.addListener();//添加监听器
}
//初始化操作
private void init(){
this.setTitle("超市货物管理!");//标题
this.setSize(600,400);//窗体大小与位置
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);
//增加组件
addNumberText.setBounds(50,280,80,25);
addNameText.setBounds(150,280,80,25);
addPriceText.setBounds(250,280,80,25);
addUnitText.setBounds(350,280,80,25);
this.add(addNumberText);
this.add(addNameText);
this.add(addPriceText);
this.add(addUnitText);
addBtn.setBounds(460,280,90,25);
this.add(addBtn);
//修改组件
updateNumberText.setBounds(50,310, 80,25);
updateNameText.setBounds(150,310,80,25);
updatePriceText.setBounds(250,310,80,25);
updateUnitText.setBounds(350,310,80,25);
this.add(updateNumberText);
this.add(updateNameText);
this.add(updatePriceText);
this.add(updateUnitText);
updateBtn.setBounds(460,310,90, 25);
this.add(updateBtn);
//删除组件
delNumberText.setBounds(50,340,80,25);
this.add(delNumberText);
delBtn.setBounds(460,340,90,25);
this.add(delBtn);
}
//添加监听器
private void addListener(){
//添加按钮监听
addBtn.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
//调用添加方法
addFruitItem();}
});
//修改按钮监听
updateBtn.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
//调用修改方法
updateFruitItem();
}
});
//删除按钮监听
delBtn.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
//调用删除方法
delFruitItem();
}
});
}
//查询方法
public abstract void queryFruitItem();
//添加方法
public abstract void addFruitItem();
//修改方法
public abstract void updateFruitItem();
//删除方法
public abstract void delFruitItem();
}
案例运行结果:
首先,我们运行cn.example.fruitstore.app包下的MainApp.java类文件,再将窗口左右上下拉大后会看到如下画面:
文章来源:https://www.toymoban.com/news/detail-501393.html
点击【进入系统】后,出现如下画面(这里画面的关于苹果的数据是我们编码时输入的,也就是系统默认的数据):
文章来源地址https://www.toymoban.com/news/detail-501393.html
到了这里,关于Java学习——水果超市商品管理系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!