簡體   English   中英

如何從JTable檢索“ $ {selectedElement}”,在JTable中將元素綁定到List

[英]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");

    (還要注意,實際上並沒有使用READ_WRITE綁定,因為bean綁定不支持從bind屬性中更改所選元素)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM