java 刷新表

混帐啊!!!!重读数据库居然不是用refresh而是要清除缓存。麻痹这谁能想到啊!!!!

   1. cxbList.clear();  
   2. entityManager.clear();  
   3. entityManager.getEntityManagerFactory().getCache().evictAll();  
   4. cxbList.addAll(cxbQuery.getResultList());  
   5. jTable1.repaint();  

刷新居然要这么复杂,搞个毛啊!!!!

http://stackoverflow.com/questions/3204592/refreshing-collection-getresultlist-of-entities-bu-entitymanager-refresh

ambassador86谢了啊~你太帅了。

--------------------------------------------------------13.2.10----------------------

经过jtable刷新之后数组越界的错误,我终于认识到阻碍刷新的根本是绑定。如果用上面的方法,只是更新已有的行,而不会把新添加的行刷出来。大概是jTableBinding或者bindingGroup里面的数组没有跟着更新,就越界了。绑定的机制还是很混乱,回头再研究。感谢pandalamail的文章收藏 NetBeans jTable绑定的刷新问题

里面基本解释的很清楚了,把刷新改成这样:

        cxbList.clear();
        cxbList.addAll(cxbQuery.getResultList());
        bindingGroup.unbind();
        bindingGroup.bind();
        jTable1.updateUI();
大概是7.2.1版本和以前的有点不一样,解绑定和绑定,不用取list,其它和pandalamail的第二种方法一样。不过重新绑定后列宽度失效了,再研究一下新版本的操作方法。

另外updateUI的刷新比repaint要彻底一些,不会出现删掉的行还留一条空白。

--------------------------2.14-------------------------

又研究了几天,发现绑定对tablemodel有神奇的影响。增加一行如果不重新绑定,那么tablemodel的rowcount显示确实多了一行,但是getvalueat去取就会数组越界。反过来如果减少一行却没事,以后的编辑只要不超过初始时的行数就没事。超了就数组越界,除非重新绑定。另外table.getmodel()的方法非常有限,根本没有addrow。

经过我反复瞎猜,我觉得netbean的人是这样认为的:数据库很大,不可能一个终端表不分页就全显示下。既然要分页,那么tablemodel初始时给的值就是一页的大小了。翻页是不需要改这个大小的。如果很小的表,要增加行,那么重新绑定也不是很麻烦的事,只不过列宽度就丢了。又由于行数少,做个自适应列宽度也不会效率太低(这个要处理列*行次,大表就很慢)。

虽然上面的解释可以自圆其说,但是我认为还是胡猜。tablemodel到底是数组还是集合,为什么能统计行数却不能取值。这一切还有待于对其内部结构的进一步理解和发掘。探索与发现,我们下期再会。

-----------------2.17-----------------------------

终于终于终于在netbeans 的论坛上找到了答案:点击打开链接

Solution: The List which is bound to jTable as content must be set to observable. It is false by default. I think it prevents the List to be updated when it is set to false. Therefore index and table size do not match and causes the ArrayLists RangeCheck to fail...

和jtable绑定的list的observable属性要打开,默认是没打开的。真是坑死爹了。最终我的刷新代码是如此简单:

cxbList.clear();
cxbList.addAll(cxbQuery.getResultList());
 连jtable的刷新都省了。此前花了200分在baidu和csdn上问,居然一个回的都没有。害得我怀疑问题这么冷门是不是ide坏了而重装一遍ide。结果还是在google上用英文查出来的,看来照这个态势,我的英语会在编程之前学好了。 

搞了快两周才解决。不过真的学了不少知识,起码绑定,表模型,持久化这三个东西是了解了不少。今天不是晴天 ,但空气却挺干净的,难得的阴天而不是阴霾天……

-----------------------2.21--------------------------

真是十万个草尼马。如果按照上面的方法,它只对行增减有反应,对修改没反应,清理缓存后才能把修改刷新出来:

entityManager.clear();  
entityManager.getEntityManagerFactory().getCache().evictAll();  
cxbList.clear();
cxbList.addAll(cxbQuery.getResultList());

还真是历史的螺旋形发展啊,这该死的刷新还有完没完。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值