“
大家好,我是wave,上次给大家讲了一下swing基础,所以这个给大家分享一下如何用swing做一个小项目
”
需求分析
项目名称:超市管理系统
需要完成的功能:
-
管理员登入管理系统 -
管理员对系统中的商品进行管理 -
实现对商品的查询、增加、修改、删除操作
咋们需求就是这么简单!
技术实现
“
首先说明这个项目开发所用的环境是Eclipse(2018版本) + MySQL5.5,并且Eclipse已经安装好了swing插件,如果还没有安装这个插件的请看如何在Eclipse中安装swing插件。
”
设计数据库
因为我们只实现一个很简单的功能,就是对商品进行增删改查操作,所以我们只需要有一个商品item表就可以了
商品应该有的属性就是商品id、商品名称、商品数量、商品价格这几个属性(完全为了简单而设计)
建表语句
-- ----------------------------
-- Table structure for item
-- ----------------------------
DROP TABLE IF EXISTS `item`;
CREATE TABLE `item` (
`id` int(16) NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL,
`num` int(16) NULL DEFAULT NULL,
`price` int(16) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_unicode_ci ROW_FORMAT = Compact;
SET FOREIGN_KEY_CHECKS = 1;
创建项目
首先我们创建一个Java项目,并建好包
entity包里面放商品实体类 view包里面放swing写出来的界面 dao包里面放关于数据库的操作
创建一个lib文件夹,并把MySQL驱动包放进去,并且build path一下
好了,现在我们的环境就算准备完毕了。
创建商品类
package com.wave.entity;
/*
* 商品类
*/
public class Item {
private Integer id;
private String name;
private Integer num;
//价格是浮点数,我们用浮点数乘于100来保存,显示的时候除以100就可以了
private Integer price;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getNum() {
return num;
}
public void setNum(Integer num) {
this.num = num;
}
public Integer getPrice() {
return price;
}
public void setPrice(Integer price) {
this.price = price;
}
}
创建商品管理界面
创建提示:右键-> new -> other -> WindowBuilder -> JFrame
我们先点击contentPane,然后修改布局为absolute布局。
这里说明一下,absolute就是绝对布局,这个布局的好处就是我们可以随意的拖拽各种组件放到任意的位置。其他布局需要的话需要遵守相应的布局的格式,所以不能随便乱放。所有绝对布局相对来说比较方便,但是绝对布局的缺陷就是如果窗口变大变小了那么窗口里面的组件不会随之变大,布局就会乱了。但是其他布局就没有这个问题了。我没有详细研究过布局,如果小伙伴想把项目做得完美可以自行研究一下,本次项目就全都使用absolute布局来完成的
接下来我们就从中间的Palette里面拖东西出来了,先选择一个JScrollPane,把它放在JFrame的上面部分,然后再把一个JTable放入JScrollPane里面。
JScrollPane是一个自动滚轮的版面,如果这个界面里面的数据超出了所能表示的范围,就会出现一个下拉的滚轮。 JTable是一个网格型的界面,我们用这个来展示商品信息。
我们再继续添加一个小小管理控制台,先添加一个JPanel,再添加相应的label、button、textField等控件,大家对着我的图添加就行了。当然,大家也可以按照自己的审美设计更好看的窗口~
查询所有
查询操作首先我们可以考虑到一进入这个界面应该就显示已存在的商品,所以我们应该在这个界面初始化的时候就把数据库的商品查出来,并使用JTable的构造函数就可以把数据加入到这个JTable里面,所以我们先来完成一个打开这个界面就可以看到已有商品的功能。
DBUtil
package com.wave.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
//这个类主要是为了避免重复写连接数据库的操作
public class DBUtil {
public static final String URL = "jdbc:mysql://localhost:3306/market";
public static final String USER = "root";
public static final String PASS = "gt1010992686";
private static Connection conn = null;
static {
try {
Class.forName("com.mysql.jdbc.Driver");
try {
conn = DriverManager.getConnection(URL,USER,PASS);
} catch (SQLException e) {
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConnection() {
return conn;
}
}
ItemDao中的selectAll方法
public Vector<Vector<String> > selectAll(){
//因为JTable要求传入的参数就是一个Vector,所以这里就直接用Vector了
Vector<Vector<String> > vectors = new Vector<>();
String sql = "select * from item";
Connection conn = DBUtil.getConnection();
ResultSet res = null;
try {
PreparedStatement pstmt = conn.prepareStatement(sql);
res = pstmt.executeQuery();
while(res.next()) {
//因为用来显示的Table只能放Vector,所以这里直接用一个Vector就好了
Vector<String> t = new Vector<>();
t.add(res.getInt("id") + "");
t.add(res.getString("name"));
t.add(res.getInt("num") + "");
t.add((res.getInt("price") / 100.0) + "");
vectors.add(t);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return vectors;
}
ItemFrame里面的代码全部放出来非常辣眼睛,所以我这里放出的是ItemFrame里面的代码片段
private JPanel contentPane;
private final JScrollPane scrollPane = new JScrollPane();
private JTable table = null;
private JTextField textField_1;
private JTextField textField_2;
private JTextField textField_3;
private JTextField textField_4;
private JTextField textField_5;
private JTextField textField_6;
private JTextField textField_7;
private JTextField textField_8;
private ItemDao itemDao = new ItemDao();
//表格头部
private String head[] = {"商品id","商品名称","商品数量","商品价格"};
private Vector<String> header = new Vector<String>();
//数据
private Vector<Vector<String>> data = new Vector<Vector<String>>();
public ItemFrame() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 492, 434);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
scrollPane.setBounds(0, 0, 476, 193);
//向版面添加头部
for(int i = 0;i < head.length;i++) {
header.add(head[i]);
}
//把数据查出来
data = itemDao.selectAll();
table = new JTable(data,header);
改好这个代码之后我们可以运行一下这个界面
添加
我们添加操作的话需要在三个JTextField中输入添加的内容,然后再点击添加按钮,因为id是主键,是自动生成的一个属性,所以不需要手动写入id。所以就是点击添加按钮就需要把数据写入数据库并且更新上面的界面UI。
这里就需要给添加这个按钮绑定一个事件,也就是说点击这个按钮会触发这个事件。这里有这个插件添加一个事件非常简单,只需要双击添加按钮,就可以自动帮你在添加按钮上绑定一个事件并且跳转到代码部分。
双击就可以看到下面这段自动生成的代码,然后在actionPerformed里面写的代码就会在这个按钮被点击的时候执行
JButton btnNewButton = new JButton("添加");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
//在这里写代码
}
});
“
这里要说明一下自动生成的代码只能支持最简单的点击事件,实际上的事件还有非常多的种类,比如鼠标左键点击、右键点击、鼠标释放等事件。有兴趣可以自己去查看一下。
”
添加button里面的完整代码
JButton btnNewButton = new JButton("添加");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
Item item = new Item();
item.setName(textField_1.getText());
item.setNum(Integer.parseInt(textField_2.getText()));
//输入的是浮点数,把它乘以100变成一个整型
item.setPrice((int)(Double.parseDouble(textField_3.getText()) * 100));
//添加进数据库
int id = itemDao.add(item);
//创建一个vector
Vector<String> row = new Vector<>();
row.add(id + "");
row.add(item.getName());
row.add(item.getNum() + "");
row.add(Double.parseDouble(textField_3.getText()) + "");
//把这个vector的数据加入到data里面
data.add(row);
//更新table
table.updateUI();
}
});
会发现一个乱码的问题,我们需要加JDBC连接的URL上加上一个参数characterEncoding=utf8就不会有这样的问题了
“
public static final String URL = “jdbc:mysql://localhost:3306/market?characterEncoding=utf8”;
”
修改
修改操作首先我们得选中界面UI上的某一行,然后在三个JTextField中写入修改的值,再点击按钮,就可以完成对商品的修改操作了。
ItemDao中的update方法
public void update(Integer id,Item item) {
String sql = "update item set name = ?,num = ?,price = ? where id = ?";
Connection conn = DBUtil.getConnection();
PreparedStatement pstmt = null;
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, item.getName());
pstmt.setInt(2, item.getNum());
pstmt.setInt(3, item.getPrice());
pstmt.setInt(4, id);
pstmt.execute();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
JButton button = new JButton("修改");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
//获取选择的那一行
int selectIndex = table.getSelectedRow();
//如果selectIndex为-1表示没有选择
if(selectIndex == -1) {
JOptionPane.showMessageDialog(ItemFrame.this, "还没有选择要修改的是哪一行!");
}else {
//获取要修改的值的id
int id = Integer.parseInt(data.get(selectIndex).get(0));
Item item = new Item();
item.setName(textField_4.getText());
item.setNum(Integer.parseInt(textField_5.getText()));
item.setPrice((int)(Double.parseDouble(textField_6.getText()) * 100));
//更新数据库数据
itemDao.update(id, item);
//更新界面数据
data.get(selectIndex).set(1, item.getName());
data.get(selectIndex).set(2, item.getNum() + "");
data.get(selectIndex).set(3, (item.getPrice() / 100.0) + "");
//更新界面
table.updateUI();
//提示一下修改成功
JOptionPane.showMessageDialog(ItemFrame.this, "修改成功", "提示",1);
}
}
});
button.setBounds(354, 67, 93, 23);
panel.add(button);
删除
修改操作就非常简单了,只需要把id写在JTextField中,然后点击删除按钮就结束了
ItemDao里面的delete方法
public void delete(Integer id) {
String sql = "delete from item where id = ?";
Connection conn = DBUtil.getConnection();
try {
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, id);
pstmt.execute();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
JButton button_1 = new JButton("删除");
button_1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
//获取要删除的id
int id = Integer.parseInt(textField_7.getText());
//从数据库删除
itemDao.delete(id);
//从界面删除
for(int i = 0;i < data.size();i++) {
if(data.get(i).get(0).equals(id + "")) {
data.remove(i);
}
}
//更新UI
table.updateUI();
//提示删除成功
JOptionPane.showMessageDialog(ItemFrame.this, "删除完成", "提示",2);
}
});
button_1.setBounds(354, 97, 93, 23);
panel.add(button_1);
按id查询
查询这里我们这里在实现一个使用id去查询一个商品的功能,当然这里也可以继续实现一个按商品名称模糊匹配去查询商品的功能,但是怎么查询其实都差不太多,所以我这里就实现一个最简单的,剩下的有兴趣可以自己研究研究。
ItemDao中的selectById方法
public Item selectById(Integer id) {
String sql = "select * from item where id = ?";
Connection conn = DBUtil.getConnection();
Item item = new Item();
try {
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, id);
ResultSet res = pstmt.executeQuery();
while(res.next()) {
item.setId(res.getInt("id"));
item.setName(res.getString("name"));
item.setNum(res.getInt("num"));
item.setPrice(res.getInt("price"));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return item;
}
JButton button_2 = new JButton("查询");
button_2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
//获取要查询的商品id
int id = Integer.parseInt(textField_8.getText());
Item item = itemDao.selectById(id);
//显示查询出来的数据
JOptionPane.showMessageDialog(ItemFrame.this, "商品id为:" + id + "的是" + item.getName() + ",还有" + item.getNum() + "件,每件" + item.getPrice() / 100.0 + "元", "提示",1);
}
});
button_2.setBounds(354, 122, 93, 23);
panel.add(button_2);
登入
接下来我们最后再实现一个登入功能,也就是我们程序应该从登入界面启动,然后输入相应的账号密码,登入成功就关闭登入界面,然后打开商品管理界面。所以我们首先创建一个登入界面。
这里要注意密码的输入框不是JTextField,而是一个专门的JPasswordField,这样密码输入框在进行输入的时候就会用’*’来代替原本输入的字母。
我们接着给登入button添加事件。
JButton button = new JButton("登入");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
//获取用户名和密码
String username = textField.getText();
String password = passwordField.getText();
//为了简单直接把账号密码写死
if(username.equals("admin") && password.equals("admin")) {
//登入成功提示
JOptionPane.showMessageDialog(LoginFrame.this, "登入成功!");
//然后创建商品管理界面
ItemFrame itemFrame = new ItemFrame();
//显示这个界面
itemFrame.setVisible(true);
//关闭登入界面
LoginFrame.this.dispose();
}else {
//否则就是登入失败,给一个提示
JOptionPane.showMessageDialog(LoginFrame.this, "登入失败!");
}
}
});
button.setBounds(47, 197, 93, 23);
contentPane.add(button);
登入之后就会进入商品管理界面
“
好了,现在主要的功能都已经完成了
”
Ending
本次的项目到这里就结束了,项目其实还有很多可以扩展的地方,如果小伙伴用的上这个的项目的话可以自行研究并扩展它。
“
完整代码已经上传在github上了:https://github.com/gtwave1/swingDemo/tree/master
”
往期推荐
扫描二维码
获取更多精彩
FingerDance
原文始发于微信公众号(FingerDance):使用swing开发的一个超市管理系统
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/26674.html