[英]How to retrieve “${selectedElement}” from a JTable where the elements are bound to a List
在我的應用程序中,我有一個JTable和一個List。
列表 :使用JPA查詢填充列表。 用戶可以通過更改GUI中的屬性來重新執行查詢。 假設查詢具有命名參數“ year”,並且用戶可以更改此參數。 然后發生以下情況(通過省略異常處理來簡化):
myList.clear() mylist.addAll( myQuery.setParameter("year", 2010) )
隨着列表的更改,綁定將觸發所需的處理程序,並且該表現在反映了新的數據集。
JTable :
JTable的內容來自BeansBinding(更確切地說是JTableBinding
)。 綁定源是上述列表。
該查詢僅對密集型任務執行。 就像在龐大的數據集上應用粗略的過濾器一樣。 帶有年份的較早示例是一個很好的示例。 這將始終將可管理的數據塊返回給客戶端。 現在,為了獲得更敏感的用戶體驗,JTable本身會進行更細粒度的篩選。 這樣可以避免不必要的數據庫往返。
接下來,假定以下情形:用戶在表中選擇一行,然后單擊“刪除”按鈕。 如果未過濾表,則所需的代碼將很簡單(再次,為了簡化代碼,不進行錯誤檢查,並發鎖定和異常處理程序):
MyObject = myList.get( myTable.getSelectedRow() );
myEntityManager.getTransaction().begin()
myEntityManager.remove( myObject )
myEntityManager.getTransaction().commit()
但是 :如果在客戶端對表進行過濾,則該表將不會反映列表中的數據。 所以getSelectedRow()
將不會返回索引,該索引將映射到List中的相同條目( 我沒有測試過,但是我相信我對這個假設是正確的嗎? )
如何最好地解決這個問題?
我已經解決了以下問題:
selectedTableElement
的新Bean,其中包含一個成員,該成員包含表中當前選定的元素。 接下來,我使用以下命令創建了一個新的綁定(源:我的表,目標:我的“ selectedElement” bean)
binding = Bindings.createAutoBinding(UpdateStrategy.READ_WRITE, myTable, ELProperty.create("${selectedElement}"), selectedTableElement, BeanProperty.create("selectedElement"), "selectedElementBinding");
該解決方案通過使用Beans Binding跟蹤表的選定元素來有效地解決了該問題。
但這真的有必要嗎? 我覺得笨拙。 一個全新的類僅封裝所選元素嗎? 是否沒有其他更直接的方法來檢索JTable
的"${selectedElement}"
屬性?
我會盡力回答您的兩個問題。
關於第一個問題(篩選出的選定索引與實際列表索引):
createJTableBinding
使用BeansBinding綁定了表。 因此,可以通過使用swing TableRowSorter和RowFilter來應用客戶端過濾。 我對嗎 ? 如果是這樣,您可以使用該方法 int row = myTable.convertRowIndexToModel(myTable.getSelectedRow());
對於第二個問題(bean保留表中的選定項)
this
對象作為源/目標對象來創建綁定,並在包含表的類中創建屬性selectedElement
。 因此,您不需要其他課程。 該代碼將是: createAutoBinding(UpdateStrategy.READ_WRITE, myTable,
ELProperty.create("${selectedElement}"), this, BeanProperty.create("selectedElement"), "selectedElementBinding");
createAutoBinding(UpdateStrategy.READ_WRITE, myTable,
ELProperty.create("${selectedElement}"), this, BeanProperty.create("selectedElement"), "selectedElementBinding");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.