import javax.swing.*;
import java.awt.*;
import javax.swing.table.*;
import java.util.*;
import java.awt.event.*;
import javax.swing.table.TableColumn;
import java.sql.*;
import sun.jdbc.odbc.JdbcOdbcDriver;
class Typec extends JFrame
{
//窗体及窗体控件
JPanel pnla=null;
JPanel pnlb=null;
JTable table=null;
TestModela md=null;
TestModelb mdb=null;
TableColumn tc=null;
javax.swing.JComboBox jc=null;
javax.swing.JCheckBox jboxa=null;
javax.swing.JCheckBox jboxb=null;
DataBase db=new DataBase(); //连接sql数据
javax.swing.JScrollPane js;
JButton but;
JTextField jt1=null;
JTextField jt2=null;
JTextField jt3=null;
JTextField jt4=null;
JTextField jt5=null;
//Object数组构造jtable
Object[][] a=new Object[2][3];
Object[] b={"a","b","c"};
//Object数组构造jtable
Object[][] aa={{"a","b","c"}};
//vector数组构造jtable
Vector va,vb,vc;
//实现功能
//1)将Object数组构造的jtable添加到窗体上去
//2)将JTable的第一列的属性改为文本框,第二列的属性改变为下拉框
void addObject()
{
table=new JTable(a,b);
tc=new TableColumn();
jt1=new javax.swing.JTextField(10);
jt1.setBackground(Color.red);
jc=new JComboBox();
jc.addItem("男");
jc.addItem("女");
tc=table.getColumnModel().getColumn(1);
tc.setCellEditor(new DefaultCellEditor(jt1));
tc=table.getColumnModel().getColumn(2);
tc.setCellEditor(new DefaultCellEditor(jc));
js=new JScrollPane(table);
this.getContentPane().add(js,BorderLayout.CENTER);
this.setSize(700,350); //必须先添加后显示,不然会不正常的显示的
this.show();
}
//实现功能
//1)使用Object模板来创建JTable
//2) 实现JTable的表格边框的隐藏和显示b及指定列的隐藏和显示
void addObjectMd()
{
pnla=new JPanel();
jt1=new JTextField(10);
but=new JButton("设置行高");
but.addActionListener(new butsj());
jboxa=new JCheckBox("隐藏",false);
jboxa.addItemListener(new MyItemListener());
jboxb=new JCheckBox("删除",false);
jboxb.addItemListener(new MyItemListener());
pnla.add(jt1);
pnla.add(but);
pnla.add(jboxa);
pnla.add(jboxb);
md=new TestModela(aa,b); //使用模板必须数组里有值
table=new JTable(md);
js=new JScrollPane(table);
pnlb=(JPanel)this.getContentPane();
pnlb.setLayout(new BorderLayout());
pnlb.add(pnla,BorderLayout.NORTH);
pnlb.add(js,BorderLayout.CENTER);
this.setSize(700,350); //必须先添加后显示,不然会不正常的显示的
this.show();
}
void addVector()
{
vc=new Vector();
vc.add("va");
vc.add("vb");
vc.add("vc");
va=new Vector();
va.add(vc);
vb=new Vector();
vb.add("va");
vb.add("vb");
vb.add("vc");
table=new JTable(va,vb);
js=new JScrollPane(table);
this.getContentPane().add(js,BorderLayout.CENTER);
this.setSize(700,350); //必须先添加后显示,不然会不正常的显示的
this.show();
}
void addVectorMd() //czVector模板类
{
//定义表中的一条数据,相当于一个一维数组
vc=new Vector();
vc.add("va");
vc.add("vb");
vc.add("vc");
vc.add(new Boolean(false));
va=new Vector();
//将产生的数据增加到va中去
va.add(vc);
vb=new Vector();
//定义JTable的标题
vb.add("va");
vb.add("vb");
vb.add("vc");
vb.add("vd");
mdb=new TestModelb(va,vb);
table=new JTable(mdb);
//表格已构造完毕
js=new JScrollPane(table);
jt1=new JTextField(10);
jt2=new JTextField(10);
jt3=new JTextField(10);
jt4=new JTextField(10);
but=new JButton("增加");
but.addActionListener(new butsj());
pnla=new JPanel();
pnla.add(jt1);
pnla.add(jt2);
pnla.add(jt3);
pnla.add(jt4);
pnla.add(but);
pnlb=(JPanel)this.getContentPane();
pnlb.setLayout(new BorderLayout());
pnlb.add(pnla,BorderLayout.NORTH);
pnlb.add(js,BorderLayout.CENTER);
this.setSize(700,350); //必须先添加后显示,不然会不正常的显示的
this.show();
}
void addVectorSql()
{
DataBase.FillVector("select * from students");
va=DataBase.data; //获取数据库中的行数据
vb=DataBase.title; //获取数据库中的标题
mdb=new TestModelb(va,vb);
table=new JTable(mdb);
js=new JScrollPane(table);
pnla=new JPanel();
pnlb=(JPanel)this.getContentPane();
pnlb.setLayout(new BorderLayout());
pnlb.add(pnla,BorderLayout.NORTH);
pnlb.add(js,BorderLayout.CENTER);
this.setSize(700,350); //必须先添加后显示,不然会不正常的显示的
this.show();
}
////处理Click事件
private class butsj implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
if((e.getSource()==but)&&but.getText().equals("增加"))
{
vc=new Vector();
vc.add(jt1.getText());
vc.add(jt2.getText());
vc.add(jt3.getText());
vc.add(new Boolean(jt4.getText().equalsIgnoreCase("true")));//将此 String 与另一个 String 进行比较,不考虑大小写。
mdb.AddRow(vc);
}
else if((e.getSource()==but)&&but.getText().equals("设置行高"))
{
int h=Integer.parseInt(jt1.getText());//得到输入的值
if(h>0)
table.setRowHeight(h);//设置table的行高
}
}
}
//处理CheckBox 的选中事件
private class MyItemListener implements ItemListener
{
public void itemStateChanged(ItemEvent e)
{
//先判断事件源 再判断事件源是否被选中
if(e.getSource()==jboxa)
if(jboxa.isSelected())
{
//设置是否显示表格线
table.setShowHorizontalLines(true);
table.setShowVerticalLines(true);
}
else
{
table.setShowHorizontalLines(false);
table.setShowVerticalLines(false);
}
//是否删除分数列
if(e.getSource()==jboxb)
if(jboxb.isSelected())//是否选中
{
tc=table.getColumnModel().getColumn(2);
table.getColumnModel().removeColumn(tc);
table.updateUI();
}
else
{
table.getColumnModel().addColumn(tc);
}
}
}
}//这是Typec的右括弧,不要搞混啦
//使用Object创建jtable模板
class TestModela extends javax.swing.table.DefaultTableModel
{
Object[][] data;
Object[] title;
TestModela(Object[][] d,Object[] t)
{
super(d,t);
this.data=d;
this.title=t;
}
public Object getValueAt(int r,int c)
{
return data[r][c];//得到r行c列的数据
}
public Class getColumnClass(int c)
{
//将不同的数据类型
//以对应的形式来显示,大家可以比较这个例子中的显示
//和前几个例子的区别
return data[0][c].getClass();
}
//设置r行,c列的值为 value
//当用户在修改JTable中的数据时,能自动调用,并修改data中的数据
public void setValueAt(Object value, int r,int c)
{
data[r][c]=value;
}
}
//使用Vector创建jtable模板
//对于JTable来说,它是一个二维结构,表中的整个数据由一个Vector
//表中的每一行也是一个Vector
class TestModelb extends javax.swing.table.DefaultTableModel
{
Vector a;
Vector b;
TestModelb(Vector a,Vector b)
{
super(a,b);
this.a=a;
this.b=b;
}
public Object getValueAt(int c,int b) //得到每一列的数据
{
Vector v=(Vector)a.get(c);//取出可变数组中的数据
return v.get(b); //得到每一行没一列的值
}
public Class getColumnClass(int c)
{
Vector v=(Vector)a.get(0);
return v.get(c).getClass(); //将字符串变成各中类型的数据
}
public boolean isCellEditable(int r,int c)
{
//除了第二列不能修改
//其它都可能修改
if(c==2)
return false;
return true;
}
//在自定义的TableModel中重写了AddRow方法
//向data中增加一个Vector,相当于增加了一条记录
public void AddRow(Vector row)
{
a.add(row);
this.fireTableDataChanged();//通知所有侦听器,表的所有行单元格值可能已更改,如果不调用,将不会更改
}
//???????????????????如何实现删除行呢
}
/*
// 在pubs数据库中建一个表students
create table students(st_xh varchar(10),st_name varchar(10),st_age int)
insert into students
values('1000 0001','小王',25)
再建一个Odbc数据源test
联结pubs
*/
class DataBase //cz数据库类
{
public static Connection conn=null;//这是一个连接对象
public static ResultSet rs=null;//这是一个记录集对象
public static Statement st=null;//这是一个语名对象
public static PreparedStatement pst=null;//执行带参数据的语句
public static CallableStatement cst=null;//执行存储过程
public static ResultSetMetaData rsmd=null;//得到记录集的原信息
public static Vector data,title,row;
//在构造函数中去联结数据库
public DataBase()
{
data=new Vector();
title=new Vector(); //必须使用异常捕获,不然程序将报错
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
conn=DriverManager.getConnection("jdbc:odbc:test","sa","sa");
st=conn.createStatement();
}catch(SQLException e)
{
e.printStackTrace();
}catch(Exception e)
{
e.printStackTrace();
}
}
//根据strSql来向两个集合增加数据
//data中存放表中的每条记录,每条记录也放入一个Vector中
//title中存放表的列的信息,根据ResultSetMetaData来提供
public static void FillVector(String strSql)
{
int s;
int fieldCount;
try{
data.clear();
title.clear();
rs=st.executeQuery(strSql);//得到结果集
rsmd=rs.getMetaData();//得到结查集的原数据
fieldCount=rsmd.getColumnCount();
while(rs.next())
{
row=new Vector();
for(int i=0;i
row.add(rs.getString(i+1));
}
//及格就增加一个true否则增加一个false
if(Integer.parseInt(row.get(row.size()-1).toString())>60)
row.add(new Boolean(true));
else
row.add(new Boolean(false));
data.add(row);
System.out.println(data.size());
}
for(int i=0;i
title.add(rsmd.getColumnLabel(i+1));
}
title.add("Pass");
}catch(SQLException e)
{
e.printStackTrace();
}
}
}
class test
{
public static void main(String args[])
{
Typec tc=new Typec();
//tc.addObject();
// tc.addObjectMd();
// tc.addVector();
// tc.addVectorMd();
tc.addVectorSql();
}
} Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd /*创建了这个例子,初次感觉啦java的面向?
标签: