划词......
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

初次感觉java面向对象的思想

Posted on 2007-06-15 11:55  王君  阅读(963)  评论(0编辑  收藏  举报

/*创建了这个例子,初次感觉啦java的面向对象的精髓,jtable只用来显示,而使用模板来改变jtable的属性,实现了表格的显示与设置分离*/




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<fieldCount;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<rsmd.getColumnCount();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的资料网站大家可以参考一下
1:http://www.yod.yoxos.com/geteclipse/W4TDelegate
2:http://www.open-open.com/25.htm
3:http://www.caixiong.com/?548350.htm
4:http://www.jboss.com/downloads/index
5:http://book.yzcc.com/sort/233_3.htm
6:http://prdownloads.sourceforge.net/hibernate/
7:http://www.opensymphony.com/webwork/download.action
8:http://download.eclipse.org/eclipse/downloads/