利用GUI完成水果超市管理系统
水果超市登录界面:
超市货物管理页面:
水果超市登录界面分析:有图标,文字标题,窗体,进入系统按钮,北区图片区,内容含有一张图片,正文为按钮区,被北区挤到到了下面,内涵一个按钮。
**超市货物管理页面:**有表格,有表格视口,JScrollPan,有不同属性的输入文本框Label,不同功能的按钮JButton;
- 创建项目,实现系统欢迎窗口类的定义
package view;
import java.awt.BorderLayout;
import java.awt.HeadlessException;
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;
/**
* 主窗口
*水果超市登录界面
*/
public abstract class AbstractMainFrame extends JFrame{
private JLabel titleLabel = new JLabel(new ImageIcon("F:\\Java\\Eclipse\\images\\fruit.jpg"));//导入相片
private JButton btn = new JButton("进入系统");//顾客按钮
//构造函数
public AbstractMainFrame(){
this.init(); // 初始操作
this.addComponent();// 添加组件
this.addListener(); // 添加监听器;
}
/**
* // 初始操作
*/
private void init() {
// TODO Auto-generated method stub
this.setTitle("水果超市欢迎你"); // 标题
this.setSize(600,400); // 窗体大小与位置
GUITools.center(this); //设置窗口上位置
GUITools.setTiTleImage(this, "F:\\JAVA\\java开发\\内容\\Chapter08\\bin\\a.jpg");
this.setResizable(false); // 窗体大小固定
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 关闭窗口
}
private void addComponent() {
// TODO Auto-generated method stub
//窗体使用默认的边界布局,北区放入图片
this.add(this.titleLabel,BorderLayout.NORTH);
//创建Jpanel对象
JPanel btnPanel =new JPanel();
//清理布局,使JPanel中的组件可以自定义位置
btnPanel.setLayout(null);
//将JPanel对象添加入窗体zhong
this.add(btnPanel);
//定义边界位置
btn.setBounds(240, 20, 120, 50);
btnPanel.add(btn);
}
/**
*添加监听器
*/
private void addListener() {
// TODO Auto-generated method stub
btn.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
showAdminDialog();
}
});
}
//展示管理员界面方法
public abstract void showAdminDialog();
}
备注:一般分三大步走,1初始化操作,2添加组件,3添加监听器
- 复杂工具类,用来设置窗口居中的方法
package view;
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));
}
}
- 定义超市货物管理窗口类
package view;
import java.awt.Frame;
import java.awt.event.ActionEvent;
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;
/**
* @author 定义超市货物管理窗口类
*
*/
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("计价单位i");//计价单位标题
//添加功能组件
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) {
// TODO Auto-generated constructor stub
super(owner,modal);
this.init();//初始化
this.addComponent();//添加组件
this.addListener();//添加监听器
}
private void init() {
// TODO Auto-generated method stub
this.setTitle("超市货物管理"); // 标题
this.setSize(600,400); //窗体大小与位置
GUITools.center(this); // 设置窗口在屏幕上的位置
this.setResizable(false); //窗体大小固定
}
//添加组件
private void addComponent() {
// TODO Auto-generated method stub
//取消布局
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() {
// TODO Auto-generated method stub
addBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
addFruitItem();
}
});
//修改监听器
updateBtn.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
updateFruitItem();
}
});
//删除监听器
delBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
delFruitItem();
}
});
}
//查询方法
public abstract void queryFruitItem();
abstract void addFruitItem();
abstract void updateFruitItem();
abstract void delFruitItem();
}
- 编写水果项的实体类
package view;
public class FruitItem {
private String number ;//编号
private String name; // 名称
private double price; //价格
private String unit ; //单位
// 构造方法
public FruitItem() {
super();
// TODO Auto-generated constructor stub
}
//有参构造方法
public FruitItem(String number, String name, double price, String unit) {
super();
this.number = number;
this.name = name;
this.price = price;
this.unit = unit;
}
//get/set方法
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;
}
}
- 定义存储数据类
package view;
import java.util.ArrayList;
public class DataBase {
public static ArrayList<FruitItem>data =new ArrayList<FruitItem>();
//初始化数据
static {
data.add(new FruitItem("1","苹果",5.0,"kg"));
}
}
- 分层编写存放数据的操作类、存放实现业务逻辑的服务类和实现管理员操作的控制类
(1、创建数据访问类)
package view;
import java.util.ArrayList;
/*
* 管理员数据方法类
*/
public class AdminDao {
//获取所有的数据
public ArrayList<FruitItem>queryAllDate(){
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);
}
}
}
}
(2创建管理服务类)
package view;
import java.util.ArrayList;
public class AdminService {
private AdminDao adminDao =new AdminDao();
//查询服务
public ArrayList<FruitItem>queryFruitItem(){
ArrayList<FruitItem>data =adminDao.queryAllDate();
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 updataFruitItem (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) {
ArrayList<FruitItem> data = queryFruitItem();
for(int i=0;i<data.size();i++) {
FruitItem fruitItem =data.get(i);
//如果存在相同编号数据,则可以删除
if(delNumber.equals(fruitItem.getNumber())) {
adminDao.delFruitItem(delNumber);
return true;
}
}
return false;
}
}
(3、创建管理员界面操作类)
package view;
import java.awt.Frame;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
public class AdminDialogController extends AbstractAdminDialog {
/*
* 管理员界面操作
*/
//定义服务类,提供完整功能服务
private AdminService adminService =new AdminService();
//构造方法
public AdminDialogController() {
super();
// TODO Auto-generated constructor stub
}
public AdminDialogController(Frame owner, boolean modal) {
super(owner, modal);
// TODO Auto-generated constructor stub
//创建对象时展示数据
queryFruitItem();
}
// 查询方法
public void queryFruitItem() {
// TODO Auto-generated method stub
//定义表头
String []thead = {"水果编号","水果名称","水果单价(/元)","计价单位"};
//调用adminService的查询服务
ArrayList<FruitItem> dataList=adminService.queryFruitItem();
//调用list2Array方法,将查询到的集合转化数组,方便为JTable赋值
String [][]tbody = list2Array(dataList);
//将查询到的结果为table赋值
TableModel dataModel =new DefaultTableModel(tbody,thead);
table.setModel(dataModel);
}
private String[][] list2Array(ArrayList<FruitItem> list) {
// TODO Auto-generated method stub
//根据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;
}
//添加方法
@Override
void addFruitItem() {
// TODO Auto-generated method stub
//获取数据
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
void updateFruitItem() {
// TODO Auto-generated method stub
String updateNumber =addNumberText.getText();
String updateName =addNameText.getText();
String updatePrice =addPriceText.getText();
String updateUnit =addUnitText.getText();
boolean updateSuccess =adminService.updataFruitItem(updateNumber,
updateName, updatePrice, updateUnit);
//如果修改成功
if(updateSuccess) {
queryFruitItem();
}else {
JOptionPane.showMessageDialog(this, "没有这个编号的水果,请检查数据!");
}
}
@Override
void delFruitItem() {
// TODO Auto-generated method stub
String delNumber =delNumberText.getText();
boolean delSucces = adminService.delFruitItem(delNumber);
if(delSucces) {
queryFruitItem();
}else {
JOptionPane.showMessageDialog(this, "没有这个编号3");
}
}
}
- 创建主界面操作类
package view;
public class AbstractMainFrameTest extends AbstractMainFrame{
public static void main(String[] args) {
new AbstractMainFrameTest().setVisible(true);
}
@Override
public void showAdminDialog() {
// TODO Auto-generated method stub
System.out.println("进入管理界面");
}
}
- 定义main主界面类
package view;
public class MainApp {
public static void main(String[] args) {
new MainFrameController().setVisible(true);
}
}
- 数据库连接封装类
package myfurit;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCUtils {
public static Connection getConnection() throws ClassNotFoundException, SQLException {
//加载驱动,并建立数据库连接
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/jdbc";
String username="root";
String password ="";
Connection conn= DriverManager.getConnection(url, username, password);
return conn;
}
//关闭数据库连接,释放资源
public static void release(Statement stmt,Connection conn) {
if(stmt!=null) {
try {
stmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
stmt=null;
}
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
conn =null;
}
}
public static void release(ResultSet rs,Statement stmt,Connection conn) {
if(rs!=null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
rs =null;
}
release(stmt,conn);
}
}
- 在数据库创建一张表如下字段
框架以上10点,具体定义属性,添加组件,添加监听器,做增删改查,连接数据库还得看具体的代码。完整的代码我已上传。