import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.sql.*;
import java.util.*;
import javax.swing.table.*;
class DataGrid extends JFrame{
final ArrayList alist=new ArrayList();
final String title[]={"num","name","birth","school"};
// 继承AbstractTableModel,构建表格模型
AbstractTableModel tm=new AbstractTableModel(){
public int getColumnCount(){
return title.length;
}
public int getRowCount(){
return alist.size();
}
public Object getValueAt(int row,int column){
if(!alist.isEmpty())
return ((ArrayList)alist.get(row)).get(column);
else
return null;
}
public String getColumnName(int column){
return title[column];
}
public void setValueAt(Object value,int row,int column){}
public boolean isCellEditable(int row,int column){
return false;
}
};
JTable jt=new JTable(tm);
JScrollPane jsp=new JScrollPane(jt);
//构造函数
public DataGrid()throws SQLException,ClassNotFoundException{
Connection c=connect();
/*定义可回滚并更新数据库的ResultSet
TYPE_SCROLL_SENSITIVE: 对数据库数据变化是敏感的,即当数据库发生改变是,结果集也就发生相应改变
TYPE_SCROLL_INSENSITIVE: 与前者相反
CONCUR_UPDATABLE: 结果集对数据库可更新
CONCUR_READ_ONLY: 不能更新
*/
Statement s=c.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
String sql="select * from student";
final ResultSet r=s.executeQuery(sql);
showResult(r);
//设置table内的单行选定(JTable利用的是ListSelectionModel)
jt.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
//添加表格(选定行)的双击左键事件
jt.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
if(e.getClickCount()==2){ //鼠标双击
//以下三句为:双击删除选定行
int row=jt.getSelectedRow();
alist.remove(row);
tm.fireTableStructureChanged();
try{
r.absolute(row+1); //结果集内数据的回滚
r.deleteRow(); //从结果集中删除光标所在的那行,并更新数据库
}catch(Exception ee){
}
}
}
});
this.getContentPane().add(jsp,BorderLayout.CENTER);
//数据库连接不能关闭,否则结果集对数据库的更新无效,关闭操作可以放在窗口关闭时间中,这里不一一实现了
//s.close();
//c.close();
}
//连接数据库方法 返回类型为 Connection
public Connection connect()throws SQLException,ClassNotFoundException{
String dburl="jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=da/student.mdb";
String user="";
String password="";
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection c=DriverManager.getConnection(dburl,user,password);
return c;
}
//用ArrayList实现的以DataGrid 样式显示数据库中的查询结果
public void showResult(ResultSet rs)throws SQLException{
alist.clear();
tm.fireTableStructureChanged();
while(rs.next()){
ArrayList rec_alist=new ArrayList();
rec_alist.add(rs.getString(1));
rec_alist.add(rs.getString(2));
rec_alist.add(rs.getDate(3));
rec_alist.add(rs.getString(4));
alist.add(rec_alist);
}
tm.fireTableStructureChanged();
}
public static void main(String[]args)throws SQLException,ClassNotFoundException{
DataGrid fm=new DataGrid();
fm.setSize(600,400);
fm.setTitle("");
fm.setVisible(true);
fm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
/* 以上数据库内表(student)结构为
num 文本
name 文本
birth 短日期
school 文本、
由于篇幅所限制,这里不一一列举,java内数据库的其他相关操作如:批处理,事务处理等,
有兴趣的可以加本人的OICQ: 27096635 EMail: migeonline@263.net
*/