我现在做一个全文检索,从特定的数据库中搜索,有时会搜索到大量的记录,这些记录就比如文章或者报纸那样,有作者,日期,标题,ID号,版次,正文等等,我做了以下几步:
1、输入检索条件
2、当检索到符合的记录后,我把这些记录(除去正文外,因为正文太大了)读到JTable中,每一列显示的是作者,日期,标题,ID 号,版次(正文没有显示)
3、当鼠标点击某一列时,就会显示其正文信息
我在第二步是使用Vector把数据(除正文外)读到JTable中的,然后用hashmap把ID号和正文关联,读到hashmap中,我的问题是:
在第2步,当检索信息后显示在JTable中时很慢,一百多条记录要十几秒,首先这里说明数据库设计没有问题,因为我在控制台输出时才1秒。
问:怎样设计数据结构改进第二步,加快其显示速度?那种容器的效率比较高
1、输入检索条件
2、当检索到符合的记录后,我把这些记录(除去正文外,因为正文太大了)读到JTable中,每一列显示的是作者,日期,标题,ID 号,版次(正文没有显示)
3、当鼠标点击某一列时,就会显示其正文信息
我在第二步是使用Vector把数据(除正文外)读到JTable中的,然后用hashmap把ID号和正文关联,读到hashmap中,我的问题是:
在第2步,当检索信息后显示在JTable中时很慢,一百多条记录要十几秒,首先这里说明数据库设计没有问题,因为我在控制台输出时才1秒。
问:怎样设计数据结构改进第二步,加快其显示速度?那种容器的效率比较高
解决方案 »
- java socket 客户端多线程提交。
- 关于一个小题
- 能不能在线程中在创建新的线程
- 一个简单的JAVA 小程序?
- 怎样用花生壳解析到本机服务器?
- 快烦死了 为什么我的jcreator 用了这么久没出问题,今天连个小小的helloword程序却只能编译而不能运行啊?
- 关于java声明的问题!
- 打算用java做些cs的程序,大家给点建议
- 为什么出这样的错误?method isDigit(java.lang.Character) not found in class java.lang.Character
- 关于 jre 版本的问题
- 数据库内容放到VECTOR最后在JTABLE总显示怎么?
- JComboBox问题
...
我可以肯定的对lz说,JTable显示数据绝对不是这个速度。
几万行,10几列的数据,用JTable刷新出来也就是1秒的事。
lz不信的话可以做个测试,暂时抛弃你的逻辑处理,
for循环等方式随便设置1万行数据到JTable并且显示,看看需要多少时间。
Swing不会傻到把整个JTable都paint(),
而是窗口显示多少才画多少,显示上没有什么效率问题的。Vector容器,书上、网上都有些说明的,效率不是特别高(不过几百几千这个数量级绝对没有关系)。
如果能确定行列数用二维数组比较好。
代码如下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();
}
}
{
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();
}
}
JTable table1 = new JTable(myModel);
JScrollPane scrollPane1 = new JScrollPane(table1);
构造 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)