混帐啊!!!!重读数据库居然不是用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());
还真是历史的螺旋形发展啊,这该死的刷新还有完没完。