在我的应用程序中,我有一个jtable和一个列表。
-
名单
:
使用jpa查询填充列表。用户可以通过更改gui中的属性来重新执行查询。假设查询有一个命名参数“year”,用户可以更改它。然后发生以下情况(通过省略异常处理来简化):
myList.clear()
mylist.addAll( myQuery.setParameter("year", 2010) )
随着列表的更改,绑定将触发所需的处理程序,表现在将反映新的数据集。
-
JIT
:
JTable的内容来自BeansBinding(更确切地说是
JTableBinding
)绑定源是上述列表。
查询仅针对密集型任务执行。就像在一个巨大的数据集上应用一个粗糙的过滤器。今年早些时候的例子就是一个很好的例子。这将始终向客户端返回一个可管理的数据块。现在,为了获得更具响应性的用户体验,jtable本身会出现更细粒度的过滤器。这避免了不必要的数据库往返。
接下来,假设以下场景:用户选择表中的一行并点击delete按钮。如果桌子上有
不
经过筛选,所需的代码很简单(同样,为了代码简单,没有错误检查、并发锁定和异常处理程序):
MyObject = myList.get( myTable.getSelectedRow() );
myEntityManager.getTransaction().begin()
myEntityManager.remove( myObject )
myEntityManager.getTransaction().commit()
然而
:如果在客户端筛选表,则该表不会反映列表中的数据。所以
getSelectedRow()
不会返回将映射到列表中同一项的索引(
我没有测试过,但我相信我的假设是正确的?
)
所以…我的问题:
如何最好地解决这个问题?
可能的解决方案?
我已经用以下方法解决了手头的问题:
-
我创建了一个名为
selectedTableElement
它包含一个成员,该成员持有表中当前选定的元素。
-
接下来,我使用
binding = Bindings.createAutoBinding(UpdateStrategy.READ_WRITE, myTable, ELProperty.create("${selectedElement}"), selectedTableElement, BeanProperty.create("selectedElement"), "selectedElementBinding");
这个解决方案通过使用bean绑定跟踪表的选定元素有效地解决了这个问题。
但这真的有必要吗?我觉得很笨重。一个全新的类只封装选定的元素?没有其他更直接的方法来检索
"${selectedElement}"
财产
JTable
?