⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sample32_9.java

📁 Java SE 6.0前32-34章示的示例代码,简单易学
💻 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 + -