文章目录
本人所作的其他相关博客:
Java窗体的创建,按钮的响应(最基础级别)
JavaGUI开发实践:登录界面模拟(连接数据库,不同身份用户进入不同界面)
这边建议各位使用快捷的窗体开发工具,JwindowBuilder,所有的窗体控件都是拖拽式的。具体使用各种博客都有。这里就不再赘述。
注意: 下面的代码不是很严谨,当时写的时候没注意,就是数据库连接使用完毕后,记得释放资源。
一、界面概览

获取数据库中的数据后,结果如图所示:
(1) 点击按钮“显示数据”后连接数据库信息:这里做的样例比较少。
(2) 点击"确定"或者取消以后,退出界面。
(3)点击“”取消按钮退出该界面。
以下是我的数据库信息:数据库版本为8.0.20
下面是数据库的变量名和数据类型。
一定要清楚自己数据库的各个量的数据类型,在后面获取结果集显示到表格中需要对应。
二、代码
package newGUI;
import javax.swing.*;
import javax.swing.table.JTableHeader;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.*;
public class SalesStatisticsFrame extends JFrame {
private JScrollPane scpDemo;
private JTableHeader jth;
private JTable tabDemo;
private JButton btnShow;
private JButton bt1;
private JButton bt2;
{
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (Exception e) {
System.out.println(e);
}
}
public SalesStatisticsFrame() {
super("生成采购报表"); //JFrame的标题名称
this.setSize(660, 600); //控制窗体大小
this.setLayout(null); //自定义布局
this.setLocation(400, 100); //点击运行以后,窗体在屏幕的位置
this.scpDemo = new JScrollPane();
this.bt1 = new JButton("确定");
this.bt2 = new JButton("取消");
this.btnShow = new JButton("显示数据");
this.bt1.setBounds(100, 480, 100, 30);
this.bt2.setBounds(380, 480, 100, 30);
this.scpDemo.setBounds(10, 50, 580, 400); //设置滚动框大小
this.btnShow.setBounds(10, 10, 120, 30); //设置按钮
this.btnShow.addActionListener(new ActionListener() //给“显示数据”按钮添加事件响应。
{
public void actionPerformed(ActionEvent ae) {
btnShow_ActionPerformed(ae);
}
});
/********按钮“确定”的响应*******/
this.bt1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
/******按钮 “取消”的响应*****/
this.bt2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
/******* 将组件加入到窗体中******/
add(this.scpDemo);
add(this.btnShow);
add(this.bt1);
add(this.bt2);
this.setVisible(true);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new SalesStatisticsFrame();
}
/***连接数据库并显示到表格中***/
public void btnShow_ActionPerformed(ActionEvent ae) {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/supermarket?serverTimezone=CTT";//注意设置时区
String username = "root";
String passwords = "Yuanfeng200517";
Connection conn = DriverManager.getConnection(url, username, passwords);
String sql = "select * from sellsreport";
PreparedStatement pstm = conn.prepareStatement(sql);
ResultSet rs = pstm.executeQuery();
int count = 0;
while (rs.next()) {
count++;
}
rs = pstm.executeQuery();
// 将查询获得的记录数据,转换成适合生成JTable的数据形式
Object[][] info = new Object[count][6];
String[] title = {"序号", "商品名称", " 商品数量", "成本价", "售价", "库存余量"};
count = 0;
while (rs.next()) {
info[count][0] = Integer.valueOf(rs.getInt("id"));
info[count][1] = rs.getString("name");
info[count][2] = Integer.valueOf(rs.getInt("quantity"));
info[count][3] = rs.getString("cost");
info[count][4] = rs.getString("sellingprice");
info[count][5] = rs.getString("strockmargin");
count++;
}
// 创建JTable
this.tabDemo = new JTable(info, title);
// 显示表头
this.jth = this.tabDemo.getTableHeader();
// 将JTable加入到带滚动条的面板中
this.scpDemo.getViewport().add(tabDemo);
} catch (ClassNotFoundException cnfe) {
cnfe.printStackTrace();
JOptionPane.showMessageDialog(null, "数据源错误", "错误", JOptionPane.ERROR_MESSAGE);
} catch (SQLException sqle) {
sqle.printStackTrace();
JOptionPane.showMessageDialog(null, "数据操作错误", "错误", JOptionPane.ERROR_MESSAGE);
}
}
}
三、代码解释
- 首先,下面的代码是用来控制Java GUI 风格的:整个try用一个大括号包起来就不会出错了。
{
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (Exception e) {
System.out.println(e);
}
}
- 连接数据库操作说明:
(1) 首先连接数据库,连接以后用count变量存储数据库中有多少行。
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/supermarket?serverTimezone=CTT";//注意设置时区
String username = "root";
String passwords = "Yuanfeng200517";
Connection conn = DriverManager.getConnection(url, username, passwords);
PreparedStatement pstm = conn.prepareStatement(sql);
ResultSet rs = pstm.executeQuery();
String sql = "select * from sellsreport";
int count = 0;
while(rs.next())
{
count++;
}
用数组title来存储你想要显示的中的列属性名
String []title= {"序号","商品名称"," 商品数量","成本价","售价","库存余量"};
实际显示就是这样:
我们用一个二维数组来存储数据库中的二维表,
Object[][] info = new Object[count][6];
然后遍历结果集,将获取每行的数据:
count = 0; //这里要清零,因为后面count要从0加到数据库中的行数。
while(rs.next())
{
info[count][0] = Integer.valueOf( rs.getInt("id")); //id是数据库中的变量名
info[count][1] = rs.getString("name");
info[count][2] = Integer.valueOf( rs.getInt("quantity") );
info[count][3] = rs.getString("cost");
info[count][4] = rs.getString("sellingprice");
info[count][5] = rs.getString("strockmargin");
count++;
}
上面代码中:
如果数据库中变量是int型的,那么用 Integer.valueOf( rs.getInt("id"));
如果数据库中变量是string型的,那么用 rs.getString("sellingprice");
引号内的字符是数据库中的变量名,必须和数据库的变量名称一样。
最后,我们把获得的数据变成表格的形式显示其中,JavaGUI用的是JTabel
// 创建JTable
this.tabDemo = new JTable(info,title);
// 显示表头
this.jth = this.tabDemo.getTableHeader();
// 将JTable加入到带滚动条的面板中
this.scpDemo.getViewport().add(tabDemo);
}
项目全部代码下载地址: JavaGUI超市进销存管理系统 所有代码
四、项目全部代码下载地址
五、 项目代码说明
有关项目的代码说明:
项目结构如下图(有很多功能用不上了,有些就是仅仅界面,没有任何响应。):
说明:
下面这个是连接数据库,生成采购报表的代码代码:
SalesStatisticFrame.java
``
下面这个是登录界面代码,
Load_GUI.java
其他的界面可以根据类名,或者直接运行来看,时间有点儿久了,忘记了。。
大一写的代码,很乱很不完整,见谅见谅
项目文件地址:JavaGUI超市进销存管理系统 所有代码
六、功能更新:根据下拉单内容查询不同数据库
这部分的功能更新已经放到我上面发的项目内了
我们实现的就是“设备信息详情”GUI界面。我们这个设备是,零售机设备,每个零售机中存储不同的商品。实现的数据查询内容就是根据设备名称查询设备中的商品信息。
另外两个界面,生成数据报表GUI代码没有贴出来。
6.1 界面概览

上面的级联查询GUI代码分别在项目中的 EquipGoodsTable.java,EquipInfoTable.java,都已经更新了。有需要读者可以自行下载。JavaGUI超市进销存管理系统 所有代码
6.2 用到的主要控件
我们主要用的是JComboBox控件,主要用到的方法就是:
jc1.getSelectedItem().toString();//获取选择的下拉单的内容并转换成String类型。
jc1.addItem(“设备1号”);
jc1.addItem(“设备2号”);
jc1.addItem(“设备3号”);
jc1.addItem(“设备4号”);;//给下拉单添加内容选项。这里是死的,其实也可以从数据库中获取细节,sql拼接字符串,将下拉单选中的内容拼接到sql语句中:注意单引号和双引号不要缺失,否则报语法错误。
geteqp=jc1.getSelectedItem().toString();
System.out.println(geteqp);
String sql = "select * from goods where belongs='"+geteqp+"'";
这里的belongs是数据库中的字段名(就是数据库中列名)。
这里解释一下,为什么单引号中还要有双引号和+。这是因为,我们如果写到Navicat,使用SQL查询,可以这样写:
SELECT * FROM goods WHERE belongs=‘设备1号’;
也就是说,如果我们直接在Navicat查询,上面这个查询语句就是根据belongs值(belongs是varchar类型的)来查询。那么,如果要在Java语句中,我们要将获取到的下拉单的值用String变量geteqp存储,然后,为了避免将变量识别为字符串,我们就要加上转义字符"++",两个加号中间填的就是变量的名字,这样就不会将变量geteqp识别为字符串了。所以最终的SQL查询语句是:
"SELECT * FROM goods WHERE belongs='"+geteqp+"'";
七、其他相关博客
7.1 Java窗体的创建,按钮的响应(最基础级别)
7.2 JavaGUI开发实践:登录界面模拟(连接数据库)
7.3 项目全部代码下载地址
有兴趣看整个项目代码的,可以看看下面的分享下面的链接。
其实最主要的功能模块已经总结在我分享的博客和这个博客了,不过,这个系统还有很多需要实现的,上面分享的项目里面还有很多未完善的功能,各位可以自己去拓展一下,SQL语句真的很重要…