📄 sample32_9.java
字号:
package wyf.jc;
import java.io.*;
import java.sql.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.util.*;
public class Sample32_9 extends JFrame implements ListSelectionListener,ActionListener
{
//创建菜单栏、菜单以及菜单项
JMenuBar jmb=new JMenuBar();
JMenu jm=new JMenu("打开");
JMenuItem[] jmi={new JMenuItem("添加图片"),new JMenuItem("删除图片"),new JMenuItem("退出")};
//创建列表框并将列表框放置到滚动窗格中
JList jl=new JList();
JScrollPane jspz=new JScrollPane(jl);
//创建标签并将标签放置到滚动窗格中
JLabel jlp=new JLabel();
JScrollPane jspy=new JScrollPane(jlp);
//创建包含列表框与标签的分割窗格
JSplitPane jsp=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,jspz,jspy);
//创建文件选择器
JFileChooser jfc=new JFileChooser();
//声明Connection、Statement以及ResultSet的引用
Connection con;
Statement st;
ResultSet rs;
//创建用来存放列表数据的向量
Vector listData=new Vector();
//创建表示SQL语句的字符串
String sqlInsert="insert into pictures values(?,?)";
String sqlDelete="delete from pictures where pname=?";
String sqlSelect="select pcontent from pictures where pname=?";
//声明PreparedStatement对象的引用
PreparedStatement psInsert;
PreparedStatement psDelete;
PreparedStatement psSelect;
//Sample32_9类构造器
public Sample32_9()
{
//通过循环对菜单项进行初始化
for(int i=0;i<jmi.length;i++)
{//将菜单项添加进菜单并为其注册监听器
jm.add(jmi[i]);
jmi[i].addActionListener(this);
}
//将菜单添加进菜单栏,并将菜单栏设置到窗体中
jmb.add(jm);
this.setJMenuBar(jmb);
//将包含列表框与标签的分割窗格添加进窗体
this.add(jsp,BorderLayout.CENTER);
//设置分隔条的初始位置以及宽度
jsp.setDividerLocation(100);
jsp.setDividerSize(4);
//设置标签的对齐方式
jlp.setHorizontalAlignment(JLabel.CENTER);
jlp.setVerticalAlignment(JLabel.CENTER);
//设置列表一次只能选中一个选项
jl.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
//为列表框注册监听器
jl.addListSelectionListener(this);
//获取数据库连接
this.getConnection();
//初始化列表
this.initList();
//设置窗体的关闭动作、标题、大小位置以及可见性
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle("数据库图片查看器");
this.setBounds(100,100,500,400);
this.setVisible(true);
//为文件选择器设置后缀过滤器
javax.swing.filechooser.FileFilter filterJpeg =
new javax.swing.filechooser.FileNameExtensionFilter("JPEG文件", "jpg", "jpeg");
javax.swing.filechooser.FileFilter filterGif =
new javax.swing.filechooser.FileNameExtensionFilter("GIF文件", "gif");
javax.swing.filechooser.FileFilter filterPng =
new javax.swing.filechooser.FileNameExtensionFilter("PNG文件", "png");
jfc.removeChoosableFileFilter(jfc.getFileFilter());
jfc.addChoosableFileFilter(filterJpeg);
jfc.addChoosableFileFilter(filterGif);
jfc.addChoosableFileFilter(filterPng);
}
//自定义的程序启动时初始化列表的方法
public void initList()
{
try
{
//获取Statement对象并查询所有的图片名
st=con.createStatement();
rs=st.executeQuery("select pname from pictures");
//清空列表数据向量
listData.clear();
//将结果集中所有的名称添加进向量
while(rs.next())
{
listData.add(rs.getString(1));
}
if(listData.isEmpty())
{//若列表为空则将删除图片菜单项设置为不可用状态
jmi[1].setEnabled(false);
}
//设置列表的数据模型
jl.setListData(listData);
//关闭结果集
rs.close();
//关闭语句
st.close();
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{//调用此方法释放资源
this.closeStateResult();
}
}
//获取选中图片文件的方法
public File getPic()
{
//弹出保存对话框
int i=jfc.showSaveDialog(this);
if(i==JFileChooser.APPROVE_OPTION)
{//按下保存按扭
return jfc.getSelectedFile();
}
return null;
}
//判断数据库是否存在的方法
public boolean isDatabaseExists()
{
//声明数据库文件目录对应的File对象
File dbFileDir=new File("pic");
//返回数据库是否存在的情况
return dbFileDir.exists();
}
//自定义的获取数据库连接的方法
public void getConnection()
{
try
{
//测试数据库是否存在
if(!this.isDatabaseExists())
{
//若不存在则创建并连接数据库
con=DriverManager.getConnection("jdbc:derby:pic;create=true","","");
//获取Statement对象并在数据库中创建一张表
st=con.createStatement();
String str="CREATE TABLE pictures("+
"pname VARCHAR(30) PRIMARY KEY,pcontent BLOB)";
st.execute(str);
st.close();
}
else
{
//若数据库存在则连接数据库
con=DriverManager.getConnection("jdbc:derby:pic","","");
}
//初始化三个PrepareStatement对象
psInsert=con.prepareStatement(sqlInsert);
psDelete=con.prepareStatement(sqlDelete);
psSelect=con.prepareStatement(sqlSelect);
}
catch(Exception e)
{
e.printStackTrace();
}
}
//实现ListSelectionListener监听接口中的方法
public void valueChanged(ListSelectionEvent lse)
{
//列表选择事件的处理方法
if(jl.getSelectedIndex()==-1)
{
//若没有列表项被选中则方法返回
return;
}
try
{
//获取选中列表项的名称
String pname=(String)jl.getSelectedValue();
//设置预编译语句中字段的值
psSelect.setString(1,pname.trim());
//提交查询并获取结果集
rs=psSelect.executeQuery();
rs.next();
//从结果集中获取图象的字节数组
byte[] bb=rs.getBytes(1);
//为标签设置图标
this.jlp.setIcon(new ImageIcon(bb));
}
catch(Exception ee)
{
ee.printStackTrace();
}
finally
{
this.closeStateResult();
}
}
//实现ActionListener监听接口中的方法
public void actionPerformed(ActionEvent ae)
{
if(ae.getSource()==jmi[0])
{ /*实现添加图片的功能*/
//获取选择的图片文件
File f=this.getPic();
if(f!=null)
{
//定义FileInputStream以及PreparedStatement对象的引用
FileInputStream fin=null;
if(listData.contains(f.getName()))
{//若同名的图片在列表中已经存在则抱错
JOptionPane.showMessageDialog(this,
"列表中图片的名称不能相同!!!","错误",JOptionPane.ERROR_MESSAGE);
return;
}
try
{
//获取图片文件的长度
long length=f.length();
//创建byte数组其长度为图片文件的长度
byte[] bb=new byte[(int)length];
//创建文件类型字节流对象并为该对象指定源文件
fin=new FileInputStream(f);
//读取文件中的数据并存储在byte数组中
fin.read(bb);
//设置预编译语句中各个字段的值
psInsert.setString(1,f.getName());
psInsert.setBytes(2,bb);
//执行插入动作
psInsert.executeUpdate();
//将文件名添加到列表数据中
listData.add(f.getName());
//重新设置列表的数据模型
jl.setListData(listData);
//使列表选中最后一行
jl.setSelectedIndex(listData.size()-1);
//设置删除图片菜单到可用状态
jmi[1].setEnabled(true);
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
try
{//关闭输入流并释放资源
fin.close();
}
catch(Exception e){}
}
}
}
else if(ae.getSource()==jmi[1])
{ /*实现删除图片的功能*/
if(jl.getSelectedIndex()==-1)
{
//若没有列表项被选中则方法返回
return;
}
try
{
//获取选中列表项的名称
String pname=(String)jl.getSelectedValue();
//设置预编译语句中图片名称字段的值
psDelete.setString(1,pname.trim());
//提交更新
psDelete.executeUpdate();
//将需要删除图片的名称从列表中移除
listData.remove(jl.getSelectedIndex());
if(listData.isEmpty())
{//如果删除后列表为空则将删除图片菜单项设置为不可编辑状态
jmi[1].setEnabled(false);
}
//将窗体右侧的图片去除
jlp.setIcon(null);
}
catch(Exception ee)
{
ee.printStackTrace();
}
}
else if(ae.getSource()==jmi[1])
{//安全退出程序
System.exit(0);
}
}
//自定义的关闭结果集的方法
public void closeStateResult()
{
try
{//关闭结果集
rs.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
public static void main(String args[])
{
//创建Sample32_9窗体对象
new Sample32_9();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -