前言:
Swing 是一个为Java设计的GUI工具包。
Swing是JAVA基础类的一部分。
Swing包括了图形用户界面(GUI)器件如:文本框,按钮,分隔窗格和表。
Swing提供许多比AWT更好的屏幕显示元素。
Swing的特点:
1、用纯Java写成,所以同Java本身一样可以支持跨平台运行;
2、是JFC的一部分,支持可更换的面板和主题(各种操作系统默认的特有主题),然而不是真的使用原生平台提供的设备,而是仅仅在表面上模仿它们。
一、创建项目
1、在SQLServer数据库中创建书籍表【Book】
2、在Eclipse中创建项目【Swing Book】
3、在src中创建4个包,分别是util包(帮助类)、entity包(实体类)、dao包(数据操作类)、ui包(窗体类)
二、配置环境
1、进行导包,将jar包导入项目
2、若要美化可导入美化包
3、运行主页面窗体
三、书籍系统的数据维护
DBHelper.java【帮助类】
public class DBHelper {
private static String cname="com.microsoft.sqlserver.jdbc.SQLServerDriver";
private static String url="jdbc:sqlserver://localhost:1433;DatabaseName=Chinese";
private static String uname="sa";//数据库登录名称
private static String pwd="1216";//登录密码
//注册静态代码块
static {
try {
Class.forName(cname);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 连接数据库
* @return
*/
public static Connection getcon() {
Connection con = null;
try {
con = DriverManager.getConnection(url, uname, pwd);
} catch (Exception e) {
e.printStackTrace();
}
return con;
}
/**
* 关闭连接
* @param con
* @param ps
* @param rs
*/
public static void closeDB(Connection con,PreparedStatement ps,ResultSet rs) {
try {
//判断con/ps/rs不为空
if(con!=null) {
con.close();
}
if(ps!=null) {
ps.close();
}
if(rs!=null) {
rs.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
//测试
public static void main(String[] args) {
System.out.println(DBHelper.getcon());
}
}
Book.java 【书籍实体类】
package com.china.entity;
public class Book {
private int bid;
private String bname;
private String btype;
private String bpeople;//面向人群
private String baddress;//出版社
private String binfo;
public Book() {
super();
}
public Book(int bid, String bname, String btype, String bpeople, String baddress, String binfo) {
super();
this.bid = bid;
this.bname = bname;
this.btype = btype;
this.bpeople = bpeople;
this.baddress = baddress;
this.binfo = binfo;
}
public Book(String bname, String btype, String bpeople, String baddress, String binfo) {
super();
this.bname = bname;
this.btype = btype;
this.bpeople = bpeople;
this.baddress = baddress;
this.binfo = binfo;
}
public int getBid() {
return bid;
}
public void setBid(int bid) {
this.bid = bid;
}
public String getBname() {
return bname;
}
public void setBname(String bname) {
this.bname = bname;
}
public String getBtype() {
return btype;
}
public void setBtype(String btype) {
this.btype = btype;
}
public String getBpeople() {
return bpeople;
}
public void setBpeople(String bpeople) {
this.bpeople = bpeople;
}
public String getBaddress() {
return baddress;
}
public void setBaddress(String baddress) {
this.baddress = baddress;
}
public String getBinfo() {
return binfo;
}
public void setBinfo(String binfo) {
this.binfo = binfo;
}
@Override
public String toString() {
return "Book [bid=" + bid + ", bname=" + bname + ", btype=" + btype + ", bpeople=" + bpeople + ", baddress="
+ baddress + ", binfo=" + binfo + "]";
}
}
BookDao.java【数据操作类】
public class BookDao {
//模糊查询
public ArrayList<Book> getBylike(String col,String str){
ArrayList<Book> blist = new ArrayList<>();
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//连接数据库
con =DBHelper.getcon();
//创建PreparedStatement对象
ps = con.prepareStatement("select * from Book where "+col+" like '%"+str+"%' ");
//执行SQL语句
rs = ps.executeQuery();
//给·占位符赋值
while(rs.next()) {
int bid = rs.getInt(1);
String bname = rs.getString(2);
String btype = rs.getString(3);
String bpeople = rs.getString(4);
String baddress = rs.getString(5);
String binfo = rs.getString(6);
//实例化一个对象
Book b = new Book(bid, bname, btype, bpeople, baddress, binfo);
//把对象添加到集合中
blist.add(b);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
DBHelper.closeDB(con, ps, rs);
}
return blist;
}
//查询单个
public Book getByid(int bid) {
Book b = null;
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
con = DBHelper.getcon();
ps = con.prepareStatement("select * from Book where bid="+bid);
rs = ps.executeQuery();
if(rs.next()) {
String bname = rs.getString(2);
String btype = rs.getString(3);
String bpeople = rs.getString(4);
String baddress = rs.getString(5);
String binfo = rs.getString(6);
//实例化一个对象
b = new Book(bid, bname, btype, bpeople, baddress, binfo);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
DBHelper.closeDB(con, ps, rs);
}
return b;
}
//添加
public int addBK(Book b) {
int i = 0;
Connection con = null;
PreparedStatement ps = null;
try {
con = DBHelper.getcon();
ps = con.prepareStatement("insert into Book values(?,?,?,?,?)");
//给占位符赋值
ps.setString(1, b.getBname());
ps.setString(2, b.getBtype());
ps.setString(3, b.getBpeople());
ps.setString(4, b.getBaddress());
ps.setString(5, b.getBinfo());
//执行sql语句
i = ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally {
DBHelper.closeDB(con, ps, null);
}
return i;
}
//修改
public int upBK(int bid,Book b) {
int i = 0;
Connection con = null;
PreparedStatement ps = null;
try {
con = DBHelper.getcon();
ps = con.prepareStatement("update Book set bname=?,btype=?,bpeople=?,baddress=?,binfo=? where bid="+bid);
//给占位符赋值
ps.setString(1, b.getBname());
ps.setString(2, b.getBtype());
ps.setString(3, b.getBpeople());
ps.setString(4, b.getBaddress());
ps.setString(5, b.getBinfo());
//执行sql语句
i = ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally {
DBHelper.closeDB(con, ps, null);
}
return i;
}
//删除
public int delBK(int bid) {
int i = 0;
Connection con = null;
PreparedStatement ps = null;
try {
con = DBHelper.getcon();
ps = con.prepareStatement("delete Book where bid="+bid);
//执行sql语句
i = ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally {
DBHelper.closeDB(con, ps, null);
}
return i;
}
}
Index_UI.java【主窗体】
public class Index_UI extends JFrame{
//上面的画布
JPanel topjp = new JPanel();
//下拉框
JComboBox<String> jcb = new JComboBox<>();
//文本框
JTextField jtf = new JTextField(10);
//查询按钮
JButton jbcx = new JButton("查询");
//中间表
JTable jt = new JTable();
//表模式
DefaultTableModel dtm = new DefaultTableModel();
//滚动面板
JScrollPane jsp = new JScrollPane(jt);
//下面的画布
JPanel bottomjp = new JPanel();
//按钮
JButton add = new JButton("添加");
JButton up = new JButton("修改");
JButton del = new JButton("删除");
JButton xq = new JButton("详情");
JButton exit = new JButton("退出");
public Index_UI() {
this.setTitle("主窗体");
this.setSize(500,500);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//画布
JPanel jp = new JPanel();
//上面的画布
topjp.add(jcb);
//给下拉框添加名称
jcb.addItem("名字");
jcb.addItem("类型");
jcb.addItem("人群");
topjp.add(jtf);
topjp.add(jbcx);
//中间表
jt.setModel(dtm);
//给表格添加标题
dtm.addColumn("编号");
dtm.addColumn("名字");
dtm.addColumn("类型");
dtm.addColumn("人群");
dtm.addColumn("出版");
dtm.addColumn("简介");
//调用showinfo方法给表格添加标题
showinfo("bname", "");
//下面的画布
bottomjp.add(add);
bottomjp.add(up);
bottomjp.add(del);
bottomjp.add(xq);
bottomjp.add(exit);
//给查询按钮添加事件
jbcx.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
//获取下拉框中的选项
String col = jcb.getSelectedItem()+"";
//判断字段
if(col.equals("名字")) {
col = "bname";
}else if(col.equals("类型")) {
col = "btype";
}else if(col.equals("人群")) {
col = "bpeople";
}
//获取关键字
String str = jtf.getText();
//调用showinfo方法
showinfo(col, str);
}
});
//给添加按钮添加事件
add.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
//打开添加窗体--同时把本窗体传过去
new Add_UI(Index_UI.this);
}
});
//给修改按钮添加事件
up.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
//获取要修改的行,获取选中的行,为选中返回-1
int row = jt.getSelectedRow();
if(row>=0) {
//获取编号
String id = dtm.getValueAt(row, 0)+"";
int bid = Integer.valueOf(id);
//调用dao类修改方法
Book b = new BookDao().getByid(bid);
//打开修改窗体--同时把本窗体传过去
new Up_UI(b, Index_UI.this);
}else {
JOptionPane.showMessageDialog(null, "请选择要修改的对象!");
}
}
});
//给删除按钮添加事件
del.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
//获取要删除的行,获取选中的行下标,为选中返回-1
int row = jt.getSelectedRow();
if(row>=0) {
//获取编号
String id = dtm.getValueAt(row, 0)+"";
int bid = Integer.valueOf(id);
if(JOptionPane.showConfirmDialog(null, "你确定要删除吗?")==0) {
//调用daol类删除方法
int i = new BookDao().delBK(bid);
if(i==1) {
JOptionPane.showMessageDialog(null, "删除成功!");
//刷新窗体
showinfo("bname", "");
}else {
JOptionPane.showMessageDialog(null, "删除失败!");
}
}else {
JOptionPane.showMessageDialog(null, "撤销删除!");
}
}else {
JOptionPane.showMessageDialog(null, "请选择要删除的对象!");
}
}
});
//给详情按钮添加事件
xq.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
//获取要查看的行,获取选中的行下标,未选中返回-1
int row = jt.getSelectedRow();
if(row>=0) {
//获取编号
String id = dtm.getValueAt(row, 0)+"";
int bid = Integer.valueOf(id);
//调用dao类查询单个方法
Book b =new BookDao().getByid(bid);
//打开详情窗体--同时把本窗体传过去
new Sel_UI(b, Index_UI.this);
}else {
JOptionPane.showMessageDialog(null, "请选择要查看的对象!");
}
}
});
//给退出按钮添加事件
exit.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
//释放本窗体资源
Index_UI.this.dispose();
}
});
//设置位置
this.getContentPane().add("North",topjp);
this.getContentPane().add("Center",jsp);
this.getContentPane().add("South",bottomjp);
//设置显示
this.setVisible(true);
}
public void showinfo(String col,String str) {
//获取到表格中的所有数据的总行数
int count = jt.getRowCount();
for (int i = 0; i < count; i++) {
dtm.removeRow(0);//每循环一次就删掉一行
}
//实例化dao类对象
BookDao bd = new BookDao();
ArrayList<Book> blist = bd.getBylike(col, str);
for (Book b : blist) {
//创建一个集合,用来接收要往表格中添加的数据
Vector<Object> v = new Vector<>();
v.add(b.getBid());
v.add(b.getBname());
v.add(b.getBtype());
v.add(b.getBpeople());
v.add(b.getBaddress());
v.add(b.getBinfo());
//将对象添加到表格中
dtm.addRow(v);
}
}
//美化
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException {
UIManager.setLookAndFeel("org.jb2011.lnf.beautyeye.BeautyEyeLookAndFeelCross");
new Index_UI();
}
}
Add_UI.java 【添加窗体】
public class Add_UI extends JFrame{
public Add_UI(Index_UI index) {
this.setTitle("添加窗体");
this.setSize(500,500);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//画布
JPanel jp = new JPanel();
//实例化一个网袋布局
GridBagLayout gbl = new GridBagLayout();
//约束对象
GridBagConstraints gbc = new GridBagConstraints();
//设置画布布局
jp.setLayout(gbl);
//名字文本
JLabel jlname = new JLabel("名字:");
//设置文本坐标
gbc.gridx = 0;
gbc.gridy = 0;
//设置名字文本的约束对象
gbl.setConstraints(jlname, gbc);
//将文本添加到画布中
jp.add(jlname);
//文本框
JTextField jtname = new JTextField(10);
gbc.gridx = 1;
gbc.gridy = 0;
gbl.setConstraints(jtname, gbc);
jp.add(jtname);
//类型文本
JLabel jltype = new JLabel("类型:");
gbc.gridx = 0;
gbc.gridy = 1;
gbl.setConstraints(jltype, gbc);
jp.add(jltype);
//类型-单选按钮
JRadioButton jrw = new JRadioButton("文学");
gbc.gridx = 1;
gbc.gridy = 1;
gbl.setConstraints(jrw, gbc);
jp.add(jrw);
JRadioButton jrt = new JRadioButton("童话");
gbc.gridx = 2;
gbc.gridy = 1;
gbl.setConstraints(jrt, gbc);
jp.add(jrt);
//单选按钮分组
ButtonGroup bg = new ButtonGroup();
bg.add(jrw);
bg.add(jrt);
//人群文本
JLabel jlrq = new JLabel("人群:");
gbc.gridx = 0;
gbc.gridy = 2;
gbl.setConstraints(jlrq, gbc);
jp.add(jlrq);
//人群-复选框
JCheckBox jcba = new JCheckBox("少儿");
gbc.gridx = 1;
gbc.gridy = 2;
gbl.setConstraints(jcba, gbc);
jp.add(jcba);
JCheckBox jcbb = new JCheckBox("青年");
gbc.gridx = 2;
gbc.gridy = 2;
gbl.setConstraints(jcbb, gbc);
jp.add(jcbb);
JCheckBox jcbc = new JCheckBox("中年");
gbc.gridx = 1;
gbc.gridy = 3;
gbl.setConstraints(jcbc, gbc);
jp.add(jcbc);
JCheckBox jcbd = new JCheckBox("老年");
gbc.gridx = 2;
gbc.gridy = 3;
gbl.setConstraints(jcbd, gbc);
jp.add(jcbd);
//出版文本
JLabel jladdress = new JLabel("出版:");
gbc.gridx = 0;
gbc.gridy = 4;
gbl.setConstraints(jladdress, gbc);
jp.add(jladdress);
//出版下拉框
JComboBox<String> jcb = new JComboBox<>();
jcb.addItem("北京");
jcb.addItem("湖南");
jcb.addItem("陕西");
jcb.addItem("四川");
jcb.addItem("浙江");
jcb.addItem("湖北");
gbc.gridx = 1;
gbc.gridy = 4;
gbl.setConstraints(jcb, gbc);
jp.add(jcb);
//简介文本
JLabel jlinfo = new JLabel("简介:");
gbc.gridx = 0;
gbc.gridy = 5;
gbl.setConstraints(jlinfo, gbc);
jp.add(jlinfo);
//文本域
JTextArea jta = new JTextArea(5,10);
//滚动面板
JScrollPane jsp = new JScrollPane(jta);
gbc.gridx = 1;
gbc.gridy = 5;
gbl.setConstraints(jsp, gbc);
jp.add(jsp);
//按钮
JButton jbadd = new JButton("添加");
gbc.gridx = 0;
gbc.gridy = 6;
gbl.setConstraints(jbadd, gbc);
jp.add(jbadd);
JButton jbqx = new JButton("取消");
gbc.gridx = 2;
gbc.gridy = 6;
gbl.setConstraints(jbqx, gbc);
jp.add(jbqx);
//给添加按钮添加事件
jbadd.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
//名字
String bname = jtname.getText();
//类型
String btype = "文学";
if(jrt.isSelected()) {
btype = "童话";
}
//人群
String bpeople = "";
if(jcba.isSelected()) {
bpeople+="少儿";
}
if(jcbb.isSelected()) {
bpeople+="青年";
}
if(jcbc.isSelected()) {
bpeople+="中年";
}
if(jcbd.isSelected()) {
bpeople+="老年";
}
//出版
String baddress = jcb.getSelectedItem()+"";
//简介
String binfo = jta.getText();
//调用dao类添加方法
Book b = new Book(bname, btype, bpeople, baddress, binfo);
if(new BookDao().addBK(b)>0) {
JOptionPane.showMessageDialog(null, "添加成功!");
//刷新表格
index.showinfo("bname", "");
//释放本窗体资源
Add_UI.this.dispose();
}else {
JOptionPane.showMessageDialog(null, "添加失败!");
}
}
});
//给取消按钮添加事件
jbqx.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
//释放本窗体资源
Add_UI.this.dispose();
}
});
this.getContentPane().add(jp);
this.setVisible(true);
}
}
Update_UI.java 【修改窗体】
public class Up_UI extends JFrame{
public Up_UI(Book b,Index_UI index) {
this.setTitle("修改窗体");
this.setSize(500,500);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//画布
JPanel jp = new JPanel();
//实例化一个网袋布局
GridBagLayout gbl = new GridBagLayout();
//约束对象
GridBagConstraints gbc = new GridBagConstraints();
//设置画布布局
jp.setLayout(gbl);
//名字文本
JLabel jlname = new JLabel("名字:");
gbc.gridx = 0;
gbc.gridy = 0;
gbl.setConstraints(jlname, gbc);
jp.add(jlname);
//文本框
JTextField jtname = new JTextField(10);
gbc.gridx = 1;
gbc.gridy = 0;
gbl.setConstraints(jtname, gbc);
jp.add(jtname);
//类型文本
JLabel jltype = new JLabel("类型:");
gbc.gridx = 0;
gbc.gridy = 1;
gbl.setConstraints(jltype, gbc);
jp.add(jltype);
//类型-单选按钮
JRadioButton jrw = new JRadioButton("文学");
gbc.gridx = 1;
gbc.gridy = 1;
gbl.setConstraints(jrw, gbc);
jp.add(jrw);
JRadioButton jrt = new JRadioButton("童话");
gbc.gridx = 2;
gbc.gridy = 1;
gbl.setConstraints(jrt, gbc);
jp.add(jrt);
//单选按钮分组
ButtonGroup bg = new ButtonGroup();
bg.add(jrw);
bg.add(jrt);
//人群文本
JLabel jlrq = new JLabel("人群:");
gbc.gridx = 0;
gbc.gridy = 2;
gbl.setConstraints(jlrq, gbc);
jp.add(jlrq);
//人群-复选框
JCheckBox jcba = new JCheckBox("少儿");
gbc.gridx = 1;
gbc.gridy = 2;
gbl.setConstraints(jcba, gbc);
jp.add(jcba);
JCheckBox jcbb = new JCheckBox("青年");
gbc.gridx = 2;
gbc.gridy = 2;
gbl.setConstraints(jcbb, gbc);
jp.add(jcbb);
JCheckBox jcbc = new JCheckBox("中年");
gbc.gridx = 1;
gbc.gridy = 3;
gbl.setConstraints(jcbc, gbc);
jp.add(jcbc);
JCheckBox jcbd = new JCheckBox("老年");
gbc.gridx = 2;
gbc.gridy = 3;
gbl.setConstraints(jcbd, gbc);
jp.add(jcbd);
//出版文本
JLabel jladdress = new JLabel("出版:");
gbc.gridx = 0;
gbc.gridy = 4;
gbl.setConstraints(jladdress, gbc);
jp.add(jladdress);
//出版下拉框
JComboBox<String> jcb = new JComboBox<>();
jcb.addItem("北京");
jcb.addItem("湖南");
jcb.addItem("陕西");
jcb.addItem("四川");
jcb.addItem("浙江");
jcb.addItem("湖北");
gbc.gridx = 1;
gbc.gridy = 4;
gbl.setConstraints(jcb, gbc);
jp.add(jcb);
//简介文本
JLabel jlinfo = new JLabel("简介:");
gbc.gridx = 0;
gbc.gridy = 5;
gbl.setConstraints(jlinfo, gbc);
jp.add(jlinfo);
//文本域
JTextArea jta = new JTextArea(5,10);
//滚动面板
JScrollPane jsp = new JScrollPane(jta);
gbc.gridx = 1;
gbc.gridy = 5;
gbl.setConstraints(jsp, gbc);
jp.add(jsp);
//按钮
JButton jbup = new JButton("修改");
gbc.gridx = 0;
gbc.gridy = 6;
gbl.setConstraints(jbup, gbc);
jp.add(jbup);
JButton jbqx = new JButton("取消");
gbc.gridx = 2;
gbc.gridy = 6;
gbl.setConstraints(jbqx, gbc);
jp.add(jbqx);
//名字 赋值
jtname.setText(b.getBname());
//类型
jrw.setSelected(true);//默认选中文学
if(b.getBtype().equals("童话")) {
jrt.setSelected(true);
}
//人群
String bpeople = b.getBpeople();
if(bpeople.contains("少儿")) {
jcba.setSelected(true);
}
if(bpeople.contains("青年")) {
jcbb.setSelected(true);
}
if(bpeople.contains("中年")) {
jcbc.setSelected(true);
}
if(bpeople.contains("老年")) {
jcbd.setSelected(true);
}
//出版
jcb.setSelectedItem(b.getBaddress());
//简介
jta.setText(b.getBinfo());
//给修改按钮添加事件
jbup.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
//名字
String bname = jtname.getText();
//类型
String btype = "文学";
if(jrt.isSelected()) {
btype = "童话";
}
//人群
String bpeople = "";
if(jcba.isSelected()) {
bpeople+="少儿";
}
if(jcbb.isSelected()) {
bpeople+="青年";
}
if(jcbc.isSelected()) {
bpeople+="中年";
}
if(jcbd.isSelected()) {
bpeople+="老年";
}
//出版
String baddress = jcb.getSelectedItem()+"";
//简介
String binfo = jta.getText();
//调用dao类修改方法
Book bk = new Book(bname, btype, bpeople, baddress, binfo);
if(new BookDao().upBK(b.getBid(), bk)>0) {
JOptionPane.showMessageDialog(null, "修改成功!");
//刷新窗体
index.showinfo("bname", "");
//释放本窗体资源
Up_UI.this.dispose();
}else {
JOptionPane.showMessageDialog(null, "修改失败!");
}
}
});
//给取消按钮添加事件
jbqx.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
//释放本窗体资源
Up_UI.this.dispose();
}
});
this.getContentPane().add(jp);
this.setVisible(true);
}
}