Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何检索${selectedElement}";从元素绑定到列表的JTable_Java_Swing_Binding_Javabeans - Fatal编程技术网

Java 如何检索${selectedElement}";从元素绑定到列表的JTable

Java 如何检索${selectedElement}";从元素绑定到列表的JTable,java,swing,binding,javabeans,Java,Swing,Binding,Javabeans,在我的应用程序中,我有一个JTable和一个List 列表: 使用JPA查询填充该列表。用户可以通过更改GUI中的属性来重新执行查询。假设查询有一个命名参数“year”,用户可以更改它。然后发生以下情况(通过省略异常处理简化): 随着列表的更改,绑定将触发所需的处理程序,表现在将反映新的数据集 JTable: JTable的内容来自BeansBinding(更准确地说是JTableBinding)。绑定源是前面提到的列表 查询仅针对密集型任务执行。就像在一个巨大的数据集上应用一个粗略的过滤器

在我的应用程序中,我有一个JTable和一个List

  • 列表: 使用JPA查询填充该列表。用户可以通过更改GUI中的属性来重新执行查询。假设查询有一个命名参数“year”,用户可以更改它。然后发生以下情况(通过省略异常处理简化):

    随着列表的更改,绑定将触发所需的处理程序,表现在将反映新的数据集

  • JTable

    JTable的内容来自BeansBinding(更准确地说是
    JTableBinding
    )。绑定源是前面提到的列表

查询仅针对密集型任务执行。就像在一个巨大的数据集上应用一个粗略的过滤器。今年早些时候的例子就是一个很好的例子。这将始终向客户端返回可管理的数据块。现在,为了获得更具响应性的用户体验,JTable本身中会出现更多细粒度过滤器。这样可以避免不必要的数据库往返

接下来,假设以下场景:用户选择表中的一行并点击delete按钮。如果尚未筛选表,则所需的代码很简单(同样,为了代码简单,没有错误检查、并发锁定和异常处理程序):

但是:如果在客户端筛选该表,该表将不会反映列表中的数据。因此
getSelectedRow()
不会返回映射到列表中相同条目的索引(我没有测试过,但我相信我的假设是正确的?

所以我的问题: 如何最好地解决这个问题

可能的解决方案? 我已通过以下方法解决了手头的问题:

  • 我创建了一个名为
    selectedTableElement
    的新Bean,其中包含一个成员,该成员持有表中当前选中的元素
  • 接下来,我使用创建了一个新绑定(源:我的表,目标:我的“selectedElement”bean)

该解决方案通过使用bean绑定跟踪表中选定的元素,有效地解决了这个问题


但这真的有必要吗?我觉得它很笨重。一个全新的类只封装选定的元素?是否没有其他更直接的方法来检索
JTable
“${selectedElement}”
属性?

我将尝试回答您的两个问题。
关于第一个问题(过滤后的选定索引与实际列表索引):

  • 我假设您通过
    createJTableBinding
    使用BeansBinding绑定了表。因此,可以通过使用swing TableRowSorter和RowFilter应用客户端过滤。我说得对吗?如果是这样,您可以使用该方法
    int row=myTable.convertRowIndexToModel(myTable.getSelectedRow())
    将筛选视图中的选定行转换为模型中的实际选定行
对于第二个问题(保留表中选定项的bean)

  • 您还可以使用
    this
    作为源/目标对象创建绑定,并在包含表的类中创建属性
    selectedElement
    。因此,您不需要另一个类。代码将是:
    createAutoBinding(UpdateStrategy.READ\u WRITE,myTable,
    创建(${selectedElement}),这是BeanProperty.create(“selectedElement”),“selectedElementBinding”)
    (还要注意,实际上并没有使用读写绑定,因为bean绑定不支持从绑定属性更改所选元素)

    • 我会尽力回答你的两个问题。
      关于第一个问题(过滤后的选定索引与实际列表索引):

      • 我假设您通过
        createJTableBinding
        使用BeansBinding绑定了表。因此,可以通过使用swing TableRowSorter和RowFilter应用客户端过滤。我说得对吗?如果是这样,您可以使用该方法
        int row=myTable.convertRowIndexToModel(myTable.getSelectedRow())
        将筛选视图中的选定行转换为模型中的实际选定行
      对于第二个问题(保留表中选定项的bean)

      • 您还可以使用
        this
        作为源/目标对象创建绑定,并在包含表的类中创建属性
        selectedElement
        。因此,您不需要另一个类。代码将是:
        createAutoBinding(UpdateStrategy.READ\u WRITE,myTable,
        创建(${selectedElement}),这是BeanProperty.create(“selectedElement”),“selectedElementBinding”)
        (还要注意,实际上并没有使用读写绑定,因为bean绑定不支持从绑定属性更改所选元素)

      这看起来很有希望。我一绕过它就去试试。这看起来很有希望。我一绕过它,就试试看。
      myList.clear()
      mylist.addAll( myQuery.setParameter("year", 2010) )
      
      MyObject = myList.get( myTable.getSelectedRow() );
      myEntityManager.getTransaction().begin()
      myEntityManager.remove( myObject )
      myEntityManager.getTransaction().commit()
      
      binding = Bindings.createAutoBinding(UpdateStrategy.READ_WRITE, myTable, ELProperty.create("${selectedElement}"), selectedTableElement, BeanProperty.create("selectedElement"), "selectedElementBinding");