我现在做一个全文检索,从特定的数据库中搜索,有时会搜索到大量的记录,这些记录就比如文章或者报纸那样,有作者,日期,标题,ID号,版次,正文等等,我做了以下几步:
1、输入检索条件
2、当检索到符合的记录后,我把这些记录(除去正文外,因为正文太大了)读到JTable中,每一列显示的是作者,日期,标题,ID   号,版次(正文没有显示)
3、当鼠标点击某一列时,就会显示其正文信息
我在第二步是使用Vector把数据(除正文外)读到JTable中的,然后用hashmap把ID号和正文关联,读到hashmap中,我的问题是:
在第2步,当检索信息后显示在JTable中时很慢,一百多条记录要十几秒,首先这里说明数据库设计没有问题,因为我在控制台输出时才1秒。
问:怎样设计数据结构改进第二步,加快其显示速度?那种容器的效率比较高

解决方案 »

  1.   

    100多条记录在table中显示是肯定不会慢的,一定是你的代码其他地方造成的原因,你可以把数据存放到vector的部分代码贴一下
      

  2.   

    当检索信息后显示在JTable中时很慢,一百多条记录要十几秒.
    ...
    我可以肯定的对lz说,JTable显示数据绝对不是这个速度。
    几万行,10几列的数据,用JTable刷新出来也就是1秒的事。
    lz不信的话可以做个测试,暂时抛弃你的逻辑处理,
    for循环等方式随便设置1万行数据到JTable并且显示,看看需要多少时间。
    Swing不会傻到把整个JTable都paint(),
    而是窗口显示多少才画多少,显示上没有什么效率问题的。Vector容器,书上、网上都有些说明的,效率不是特别高(不过几百几千这个数量级绝对没有关系)。
    如果能确定行列数用二维数组比较好。
      

  3.   

    注:代码中ConnectionBean 是我自定义连接数据库并操作的类,rs是ResultSet的对象
    代码如下public ShowResult(ConnectionBean connBean)//ConnectionBean 是我自定义连接数据库并操作的类,
     {
    super("结果");
    recordCount= connBean.trsrs.getRecordCount();//获取记录数
    Vector columnNames = new Vector();           //存放列名
    Vector rows = new Vector();                 //存放每一行的内容
             try{

        if(connBean.rs.getRecordCount()>0)//当存在记录时
         {
           for(int i = 0; i < connBean.rs.getColumnCount(); i++)
    {
      columnNames.addElement(connBean.rs.getColumnName(i));//获取列名

    }

    for(int j = 0; j < connBean.rs.getRecordCount();j++)
    {
       Vector currentRow = new Vector();//用来存放当前行的内容
        connBean.rs.moveTo(0, j);//往下移动搜索记录

       for(int i = 0; i < connBean.rs.getColumnCount()-1; i++)//-1最后一列是正文 
       {
         currentRow.addElement(connBean.rs.getString(i));//获取当前行的内容
     
       }

            mymap.put(connBean.rs.getString(0),connBean.rs.getString(6) );//把正文和ID号对应存
             rows.addElement(currentRow);//存放所有行内容

           }
       }

    }catch(SQLException e)
    {
       System.out.println("连接数据库错误");
       e.printStackTrace();
    }catch(NullPointerException e)
     {
    System.out.println("对象为空");
    e.printStackTrace();
    }
    }
      

  4.   

    代码贴的有点乱,重新贴public ShowResult(ConnectionBean connBean)//ConnectionBean 是我自定义连接数据库并操作的类,
     {
        super("结果");
        recordCount= connBean.trsrs.getRecordCount();//获取记录数
         Vector columnNames = new Vector();           //存放列名
         Vector rows = new Vector();                 //存放每一行的内容
         try
        {
            
           if(connBean.rs.getRecordCount()>0)//当存在记录时
             {
               for(int i = 0; i < connBean.rs.getColumnCount(); i++)
               {
                 
                   columnNames.addElement(connBean.rs.getColumnName(i));//获取列名
                 
                 }
                        
               for(int j = 0; j < connBean.rs.getRecordCount();j++)
               {    
                  Vector currentRow = new Vector();//用来存放当前行的内容
                    connBean.rs.moveTo(0, j);//往下移动搜索记录
                    
                    for(int i = 0; i < connBean.rs.getColumnCount()-1; i++)//-1最后一列是正文 
                     {    
                   
                      currentRow.addElement(connBean.rs.getString(i));//获取当前行的内容
                     
                      }
                    
                 mymap.put(connBean.rs.getString(0),connBean.rs.getString(6) );//把正文和ID号对应存
                   rows.addElement(currentRow);//存放所有行内容
                    
               }
           }
                
        }catch(SQLException e)
        {
           System.out.println("连接数据库错误");
           e.printStackTrace();
        }catch(NullPointerException e)
         {
            System.out.println("对象为空");
            e.printStackTrace();
        }
    }
      

  5.   

    100行数据放到vector里面也是很快的,你是怎么把vector放到tablemodel里面然后再显示的?
      

  6.   

    建议使用profile跑跑,看看程式运行的瓶颈在什么地方。
      

  7.   

    就是如下把数据装到table中的,其中rows,columnNames是上面代码中的变量     DefaultTableModel myModel = new DefaultTableModel(rows,columnNames);
         JTable table1 = new JTable(myModel);
         JScrollPane scrollPane1 = new JScrollPane(table1);
      

  8.   

    用这个构造函数试试DefaultTableModel(Vector data, Vector columnNames) 
    构造 DefaultTableModel,并通过将 data 和 columnNames 传递到 setDataVector 方法来初始化该表。http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/javax/swing/table/DefaultTableModel.html#DefaultTableModel(java.util.Vector,%20int)