Java 如何检索${selectedElement}";从元素绑定到列表的JTable
在我的应用程序中,我有一个JTable和一个ListJava 如何检索${selectedElement}";从元素绑定到列表的JTable,java,swing,binding,javabeans,Java,Swing,Binding,Javabeans,在我的应用程序中,我有一个JTable和一个List 列表: 使用JPA查询填充该列表。用户可以通过更改GUI中的属性来重新执行查询。假设查询有一个命名参数“year”,用户可以更改它。然后发生以下情况(通过省略异常处理简化): 随着列表的更改,绑定将触发所需的处理程序,表现在将反映新的数据集 JTable: JTable的内容来自BeansBinding(更准确地说是JTableBinding)。绑定源是前面提到的列表 查询仅针对密集型任务执行。就像在一个巨大的数据集上应用一个粗略的过滤器
- 列表: 使用JPA查询填充该列表。用户可以通过更改GUI中的属性来重新执行查询。假设查询有一个命名参数“year”,用户可以更改它。然后发生以下情况(通过省略异常处理简化): 随着列表的更改,绑定将触发所需的处理程序,表现在将反映新的数据集
- JTable:
JTable的内容来自BeansBinding(更准确地说是
)。绑定源是前面提到的列表JTableBinding
getSelectedRow()
不会返回映射到列表中相同条目的索引(我没有测试过,但我相信我的假设是正确的?)
所以我的问题:
如何最好地解决这个问题
可能的解决方案?
我已通过以下方法解决了手头的问题:
- 我创建了一个名为
的新Bean,其中包含一个成员,该成员持有表中当前选中的元素selectedTableElement
- 接下来,我使用创建了一个新绑定(源:我的表,目标:我的“selectedElement”bean)
但这真的有必要吗?我觉得它很笨重。一个全新的类只封装选定的元素?是否没有其他更直接的方法来检索
JTable
的“${selectedElement}”
属性?我将尝试回答您的两个问题。关于第一个问题(过滤后的选定索引与实际列表索引):
- 我假设您通过
使用BeansBinding绑定了表。因此,可以通过使用swing TableRowSorter和RowFilter应用客户端过滤。我说得对吗?如果是这样,您可以使用该方法createJTableBinding
int row=myTable.convertRowIndexToModel(myTable.getSelectedRow())代码>
将筛选视图中的选定行转换为模型中的实际选定行
- 您还可以使用
作为源/目标对象创建绑定,并在包含表的类中创建属性this
。因此,您不需要另一个类。代码将是:selectedElement
createAutoBinding(UpdateStrategy.READ\u WRITE,myTable,
创建(${selectedElement}),这是BeanProperty.create(“selectedElement”),“selectedElementBinding”)代码>
(还要注意,实际上并没有使用读写绑定,因为bean绑定不支持从绑定属性更改所选元素) - 我假设您通过
使用BeansBinding绑定了表。因此,可以通过使用swing TableRowSorter和RowFilter应用客户端过滤。我说得对吗?如果是这样,您可以使用该方法createJTableBinding
int row=myTable.convertRowIndexToModel(myTable.getSelectedRow())代码>
将筛选视图中的选定行转换为模型中的实际选定行 - 您还可以使用
作为源/目标对象创建绑定,并在包含表的类中创建属性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");