• 由jtable浅谈vector<vector<Object>>的用法(转自a718515028的专栏)


    以前只用过vector<Object>  ,但是在做从数据库导出数据放到jtable中时,发现还有个vector<vector<Object>>的用法。

    先说jtable和DefaultTableModel

    jtable本身是可以显示一张列表,但是不能按钮监听的增加正行数据。

    jtable中没有addRow(Object[] rowData) 或者addRow(Vector rowData) ,方法。

    但是jtable中有一个构造方法,JTable(TableModel dm)

    而TableModel是一个接口,实现这个接口有一个常用的类DefaultTableModel。在DefaultTableModel中有一个方法,addRow(Object[] rowData)可以将一个一维数组的数据添加到这个table中model的结尾,同时还有一个addRow(Vector rowData)方法,可以将一个Vector集合添加到table中model的结尾。

     

    tip:

    说明为什么会有addRow(Object[] rowData)和addRow(VectorrowData)呢?

    我们知道数组有个特性就是长度固定,addRow(Object[] rowData)只 能添加长度固定的一个数组数据。也就是说如果要查询的数据的长度的未知,如果用数组就需要事先初始化数组的长度,当由于长度未知,就不得不设置的很大以至于能存储要查询的数据。如果数据不够这个这个数组的长度,那么剩余的长度也会添加到中table或者table的model中,这些部分将以空白数据显示 在table中

    而vector有个特性就是长度可变,有多少数据就用多少的vector长度,不够的自动增长为原来长度的一倍。  在向table中或model中添加数据时,就算要查询的数据的长度未知,vector也会自动增加长度容纳这些数据,不会造成空间浪费。既然 vector中没有空白的空间,那么table中也就自然不存在空白的数据。

     

    怎样把数据以jtable显示。

    jtable中的数据是以二维数组的形式添加到table中的,

    publicJTable(Object[][] rowData,Object[] columnNames)

    前面一个参数代表数据,后面一个代表列。

    如:

    1 String [] title = {"学号","姓名","成绩"};  
    2 Object[][]o = {{"1","张三","80"},{"2","里斯","550"},{"3","王二","70"}};  
    3 Jtable jt  = newJTable(o,title); 

    这只是显示固定的数据。如果要显示从数据库中查询出来的数据, 就必然用到vector<vector<Object>>。为什么不直接用Vector<Object>,如直接把 Vector<Student>,直接加到jtable中,Student对象可以自动得到student的姓名、成绩等值,加入到 jtable中??这种说看似很合理,但是,我们要知道jtable只能显示一个数据,不会智能的显示这个对象的各个属性值,所以我们要把这个 Student对象的属性值也要显式的输出来放到一个集合中,再放到table中。table的每行组成一个vector,每一行的数据有组成一个 vector,就需要在vector中再放一个vector,因为vector的底层也是基于数组的,所以就好像是一个二维数组,第一个vector代表 行,第二个vector代表这个行的各列数据。

    在API中DefaultTableModel的一个构造方法是这样定义的

    DefaultTableModel
    public DefaultTableModel(Vector data,
    Vector columnNames)构造一个 DefaultTableModel,并通过将 data 和 columnNames 传递到 setDataVector 方法来初始化该表。 

    参数:
    data - 表的数据,它是一个 Vector,由包含多个 Object 值的 Vector 组成(注意)
    columnNames - 包含新的列名称的 vector

    比如我们有一个已经查询好的集合Vector<Book> bookList;

    在jtable中显示这个集合

     

    Vector<String> title = newVector<String>();// 列名           
      
                   title.add("ISBN");  
      
                   title.add("书名");  
      
                   title.add("书类型");  
      
                   title.add("单价");  
      
    Vector<Vector<Object>> data = newVector<Vector<Object>>();//  
      
    for (int i = 0; i < bookList.size(); i++) {  
      
                           Vector<Object>v = new Vector<Object>();//里面一层的vector存放书的各个数据  
      
                           Bookb = bookList.get(i);                      
      
                           v.add(b.getIsbn());  
      
                           v.add(b.getBookName());  
      
                           v.add(b.getBookType());  
      
                           v.add(b.getPrice());                                   
      
                           data.add(v);//外面一层的vector  data存放已经有数据的第一个vector v  
      
                   }  
      
    DefaultTableModel model = new  DefaultTableModel(data, title);  
      
    table = new JTable(model){  
      
                           publicboolean isCellEditable(int row,int col){  
      
                                      return false;}};//利用一个匿名内部类重写这个jtable中isCellEditable方法,设置为不可编辑。  

     

     

  • 相关阅读:
    k线图
    Sql Server中查看所有数据库,表名,字段名以及字段类型
    通过datetime模块获取几秒,几分钟,几天前的时间
    线程池回调函数实时调用返回值
    pandas操作excel
    read_excle
    to_excel
    set_index
    DataFrame
    Python笔记003-字符串(1)
  • 原文地址:https://www.cnblogs.com/JamKong/p/4599354.html
Copyright © 2020-2023  润新知