Java - Swing用户界面设计(6)

2.3.19表格(JTable)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

  表格是Swing新增加的组件,主要功能是把数据以二维表格的形式显示出来。使用表格,依据M-V-C的思想,最好先生成一个MyTableModel类型的对象来表示数据,这个类是从AbstractTableModel类中继承来的,其中有几个方法是一定要重写,例如getColumnCount,getRowCount,getColumnName,getValueAt。因为Jtable会从这个对象中自动获取表格显示所必需的数据,AbstractTableModel类的对象负责表格大小的确定(行、列)、内容的填写、赋值、表格单元更新的检测等等一切跟表格内容有关的属性及其操作。JTable类生成的对象以该TableModel为参数,并负责将TableModel对象中的数据以表格的形式显示出来。

  JTable类常用的方法有:

  getModel()//获得表格的数据来源对象

  JTable(TableModeldm)//dm对象中包含了表格要显示的数据

  //下列两个构造方法,第一个参数是数据,第二个参数是表格第一行中显示的内容

  JTable(object[][]rowData,object[]columnNams);

  JTable(Vector[][]rowData,Vector[]columnNams);

 例3RecorderOfWorkers

<!--EndFragment-->
  1. importjavax.swing.JFrame;
  2.   publicclassTableDemoextendsJFrame{
  3.     privatebooleanDEBUG=true; 
  4.    publicTableDemo(){//实现构造方法
  5.       super("RecorderOfWorkers");//首先调用父类JFrame的构造方法生成一个窗口
  6.       MyTableModelmyModel=newMyTableModel();//myModel存放表格的数据 
  7.      JTabletable=newJTable(myModel);//表格对象table的数据来源是myModel对象
  8.       table.setPreferredScrollableViewportSize(newDimension(500,70));//表格的显示尺寸
  9.       //产生一个带滚动条的面板
  10.       JScrollPanescrollPane=newJScrollPane(table);
  11.       //将带滚动条的面板添加入窗口中 
  12.      getContentPane().add(scrollPane,BorderLayout.CENTER);
  13.       addWindowListener(newWindowAdapter(){//注册窗口监听器
  14.         publicvoidwindowClosing(WindowEvente){
  15.           System.exit(0);
  16.         }
  17.       });
  18.   }   
  19.      //把要显示在表格中的数据存入字符串数组和Object数组中
  20.  classMyTableModelextendsAbstractTableModel{ 
  21.     //表格中第一行所要显示的内容存放在字符串数组columnNames中
  22.     finalString[]columnNames={"FirstName",
  23. "Position", 
  24. "Telephone",   
  25.             "MonthlyPay", 
  26.     "Married"}; 
  27.     //表格中各行的内容保存在二维数组data中   
  28.    finalObject[][]data={
  29.         {"Wangdong","Executive", "01068790231",newInteger(5000),newBoolean(false)},
  30.       {"LiHong","Secretary",  "01069785321",newInteger(3500),newBoolean(true)},
  31.       {"LiRui","Manager",   "01065498732",newInteger(4500),newBoolean(false)},
  32.       {"ZhaoXin","Safeguard","01062796879",newInteger(2000),newBoolean(true)}, 
  33.       {"ChenLei","Salesman", "01063541298",newInteger(4000),newBoolean(false)}
  34.       }; 
  35.  //下述方法是重写AbstractTableModel中的方法,其主要用途是被JTable对象调用,以便在表格中正确的显示出来。程序员必须根据采用的数据类型加以恰当实现。  
  36.      //获得列的数目 
  37.      publicintgetColumnCount(){   
  38.       returncolumnNames.length;
  39.       } 
  40.      //获得行的数目  
  41.     publicintgetRowCount(){    
  42.      returndata.length;
  43.       }    
  44.   //获得某列的名字,而目前各列的名字保存在字符串数组columnNames中  
  45.     publicStringgetColumnName(intcol){    
  46.      returncolumnNames[col];
  47.       }   
  48.    //获得某行某列的数据,而数据保存在对象数组data中    
  49.   publicObjectgetValueAt(introw,intcol){   
  50.       returndata[row][col];
  51.       }   
  52.    //判断每个单元格的类型   
  53.    publicClassgetColumnClass(intc){  
  54.        returngetValueAt(0,c).getClass();
  55.       }   
  56.    //将表格声明为可编辑的     
  57.  publicbooleanisCellEditable(introw,intcol){
  58.          if(col<2){
  59.            returnfalse;
  60.          }else{
  61.            returntrue;
  62.          }
  63.       } 
  64.      //改变某个数据的值    
  65.   publicvoidsetValueAt(Objectvalue,introw,intcol){
  66.          if(DEBUG){
  67.            System.out.println("Settingvalueat"+row+",
  68.                  "+col
  69.                   +"to"+value
  70.                   +"(aninstanceof"
  71.                   +value.getClass()+")");
  72.          }
  73.          if(data[0][col]instanceofInteger
  74.              &&!(valueinstanceofInteger)){
  75.           try{
  76.              data[row][col]=newInteger(value.toString());
  77.              fireTableCellUpdated(row,col);
  78.           }catch(NumberFormatExceptione){
  79.              JOptionPane.showMessageDialog(TableDemo.this,
  80.               "The"+getColumnName(col)
  81.               +"columnacceptsonlyintegervalues.");
  82.           }      }else{
  83.           data[row][col]=value;
  84.           fireTableCellUpdated(row,col);
  85.       }      
  86. if(DEBUG){
  87.    System.out.println("Newvalueofdata:");
  88.           printDebugData();
  89.       }
  90.    }
  91.    privatevoidprintDebugData(){
  92.     intnumRows=getRowCount();
  93.       intnumCols=getColumnCount();
  94.       for(inti=0;i<numRows;i++){
  95.         System.out.print("row"+i+":");
  96.         for(intj=0;j<numCols;j++){
  97.           System.out.print(""+data[i][j]);
  98.         }
  99.         System.out.println();
  100.       }
  101.       System.out.println("--------------------------");
  102.    }
  103.   }
  104.   publicstaticvoidmain(String[]args){
  105.    TableDemoframe=newTableDemo();
  106.    frame.pack();
  107.    frame.setVisible(true);
  108.   }
  109.  }
  110.       }
  111.    }
  112.   }

你可能感兴趣的:(java,C++,c,swing,Office)