2010-04-30 34 views
1

在Netbeans中,我創建了一個JTable並將其值綁定到JPA結果集。這很好。該查詢包含我在「查詢結果」組件的pre-create框中設置的參數。 NetBeans將創建查詢結果所以就在我寫這篇文章:刷新與jTable綁定的JPA結果列表

myQuery.setParameter("year", "1997"); 

這工作得很好。現在,我有一個事件處理程序,它應該更改參數並在表中顯示新值。所以我這樣做:

myQuery.setParameter("year", "2005"); 
myResultList.clear(); 
myResultList.addAll(myQuery.getResultList()); 
jTable1.updateUI(); 

這工作,但它感覺我錯了。 注意:結果集是綁定到表。所以我希望有這樣的事情:

myQuery.setParameter("year", "2005"); 
myResultList.refresh(); 

有沒有這樣的事情?

+0

你的意思是你的JTable使用ResultSet作爲它的TableModel嗎? – Riduidel 2010-04-30 08:24:12

回答

3

我終於想通了...

問題的根源在於JTableBinding類。以下是API文檔的重要摘錄:

如果List是ObservableList的實例,那麼對List內容的更改(例如添加,刪除或替換對象)也會反映在JTable中。重要提示:在參與JTableBinding的過程中更改不可觀察列表的內容不受支持,從而導致未定義的行爲和可能的異常。

實際上,在不是可觀察列表的情況下更改列表內容在結果UI中有奇怪的行爲。例如,如果您的初始查詢返回1000行,並且更新後列表僅包含100行,則綁定的JTable仍允許您嘗試滾動查看結果。 UI「暫停」了一會兒。

事實上,在Netbeans中使用JPA時,如果使用pallette中相應的組件,則可以輕鬆修復此問題。 QueryResult「小部件」有一個複選框標籤「可觀察」。檢查這一個,你就完成了。現在,對結果的所有更改都會自動反映到JTable中。所以你可以簡單地做:

myQuery.setParameter("year", "2005"); 
myResultList.clear(); 
myResultList.addAll(myQuery.getResultList()); 

沒有做任何事情。

2

是的,這是錯誤的,你不應該使用updateUI()。當您執行LAF更改時會使用該方法,但您沒有這樣做。

我不知道Netbeans綁定是如何工作的,但是如果模型是更新的,那麼它需要通知表以便表可以重新繪製自己。

如果綁定重新創建一個新的TableModel,那麼你應該做

table.setModel(theNewModel); 

如果模型只是更新自身,那麼它應該調用:

fireTableDataChanged(...);