关于容器读取大量数据显示到JTable中的效率

paodan 2009-03-25 09:26:34
我现在做一个全文检索,从特定的数据库中搜索,有时会搜索到大量的记录,这些记录就比如文章或者报纸那样,有作者,日期,标题,ID号,版次,正文等等,我做了以下几步:
1、输入检索条件
2、当检索到符合的记录后,我把这些记录(除去正文外,因为正文太大了)读到JTable中,每一列显示的是作者,日期,标题,ID 号,版次(正文没有显示)
3、当鼠标点击某一列时,就会显示其正文信息
我在第二步是使用Vector把数据(除正文外)读到JTable中的,然后用hashmap把ID号和正文关联,读到hashmap中,我的问题是:
在第2步,当检索信息后显示在JTable中时很慢,一百多条记录要十几秒,首先这里说明数据库设计没有问题,因为我在控制台输出时才1秒。
问:怎样设计数据结构改进第二步,加快其显示速度?那种容器的效率比较高
...全文
222 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
hanwangabc 2009-04-13
  • 打赏
  • 举报
回复
假如是n列的,你可以把几项合并,把列减少这样就会减少开销
yjwfgihc 2009-04-11
  • 打赏
  • 举报
回复
真的吧,是不是哦
palm_civet 2009-04-11
  • 打赏
  • 举报
回复
用这个构造函数试试

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)
paodan 2009-04-10
  • 打赏
  • 举报
回复
就是如下把数据装到table中的,其中rows,columnNames是上面代码中的变量

DefaultTableModel myModel = new DefaultTableModel(rows,columnNames);
JTable table1 = new JTable(myModel);
JScrollPane scrollPane1 = new JScrollPane(table1);
our651 2009-04-10
  • 打赏
  • 举报
回复
建议使用profile跑跑,看看程式运行的瓶颈在什么地方。
palm_civet 2009-04-09
  • 打赏
  • 举报
回复
100行数据放到vector里面也是很快的,你是怎么把vector放到tablemodel里面然后再显示的?
paodan 2009-03-27
  • 打赏
  • 举报
回复
怎么没人回答了啊
paodan 2009-03-25
  • 打赏
  • 举报
回复
代码贴的有点乱,重新贴

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();
}
}


paodan 2009-03-25
  • 打赏
  • 举报
回复
注:代码中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();
}
}
wunan320 2009-03-25
  • 打赏
  • 举报
回复
当检索信息后显示在JTable中时很慢,一百多条记录要十几秒.
...
我可以肯定的对lz说,JTable显示数据绝对不是这个速度。
几万行,10几列的数据,用JTable刷新出来也就是1秒的事。
lz不信的话可以做个测试,暂时抛弃你的逻辑处理,
for循环等方式随便设置1万行数据到JTable并且显示,看看需要多少时间。
Swing不会傻到把整个JTable都paint(),
而是窗口显示多少才画多少,显示上没有什么效率问题的。

Vector容器,书上、网上都有些说明的,效率不是特别高(不过几百几千这个数量级绝对没有关系)。
如果能确定行列数用二维数组比较好。
yanhan0615 2009-03-25
  • 打赏
  • 举报
回复
100多条记录在table中显示是肯定不会慢的,一定是你的代码其他地方造成的原因,你可以把数据存放到vector的部分代码贴一下

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧