代码之家  ›  专栏  ›  技术社区  ›  exhuma

如何从元素绑定到列表的jtable中检索“${selectedelement}”

  •  1
  • exhuma  · 技术社区  · 14 年前

    在我的应用程序中,我有一个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 ?

    1 回复  |  直到 14 年前
        1
  •  1
  •   Marco Dalla Vecchia    14 年前

    我试着回答你的两个问题。
    关于第一个问题(筛选的选定索引与实际列表索引):

    • 我假设您使用beansbinding绑定了表,通过 createJTableBinding . 因此,客户端过滤可以通过使用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");

      (还要注意,实际上并没有使用读写绑定,因为bean绑定不支持从绑定属性更改所选元素)