因为公司的项目要求最近接触了点SWING的东西,用到了jtable,原本
使用类似
Object[][] o;
jTable1.setModel(new javax.swing.table.DefaultTableModel(o, new String[]{
"行号", "仓库名称", "化学品名称", "计量单位", "已记录库存", "实际库存", "是否一致"
}
我们只需要根据我们数据量的大小动态的初始化Object[][] o的大小,然后下面一个一个赋值,比如
O[0][0]表示第一行第一列的值,一个一个赋值,然后
jTable1.repaint();重新绘图就可以了。
显示方法具体就不介绍了,我想介绍下逐行显示的问题。如果数据量小的话,你直接用上面的就可以了。
但是数据量大的时候,得到我们的数据可能就要很长的时间,反正是所有的赋值结束才能显示出来。于是我们就想有逐行显示的效果。
然后你会发现一个增加一行的方法,是这样的
model.insertRow(table.getSelectedRow(), new Object[] {
"追加列_0_0_0", "追加列_0_0_0", "追加列_0_0_0" });
调用这个就可以往最后增加一行
也许一开始我们肯定都是这样,有个监听触发
类似如下:
publicvoid actionPerformed(ActionEvent e) {
//1.得到我们要显示的数据集合
//2.循环调用上面的 insertRow方法
//我就用个循环代替下
for(int i=0;i<100;i++){
model.insertRow(model.getRowCount(), new Object[] { "追加列_0_0",
"追加列_0_0", "追加列_0_0" });
Thread.sleep(1000);
}
}
我们期待的结果:
插了一行,过了一秒,下一行出来了
实际的结果呢?
等着,没反应,最后100条一起显示出现。
实际上这个问题我困惑了蛮久,最后终于发现了原因,只要是监听,只有等等个监听方法执行完毕了,它才开始刷新界面。你调用什么刷新方法都是没用的。
那么我们怎么解决呢?
当然是线程拉,简单的讲就是监听方法只负责启动线程。
插入的部分放到线程的RUN里。
类似下面:
publicvoid actionPerformed(ActionEvent e) {
Thread thread= new Thread(this);
thread.start();
}
publicvoid run() {
// TODO Auto-generated method stub
while(true){
model.insertRow(model.getRowCount(), new Object[] { "追加列_0_0",
"追加列_0_0", "追加列_0_0" });
// System.out.println(model.getRowCount());
Thread.currentThread().sleep(1000);
}
}
这只是一个示例,实际的情况是还需要去数据库取药显示的集合,我给大家一个建议
启两个线程,一个线程负责查询集合,一个线程负责插入,
插入的线程需要实时的查看数据集合是否有新的数据,有马上显示出来。
这样的话,即使计算量很大,我们也不需要全部计算完成,才可以一条条显示,增加哟过户体验哦。
给大家一个可以运行的JAVA文件吧,有兴趣的可以下载来看看那。
点中间那个按钮绝对一行行逐行显示的。
Jtable.java