以下是我遇到的问题的一个简单示例。
我有一个简单的课程:
public class Test{
Integer a;
Integer b;
//getters and setters
public void getC()
{
return a + b;
}
}
请注意,它有一个名为C的属性,它是a和b的总和。
然后我将它绑定到JTable,如下所示:List<Test> testList = new ArrayList<Test>();
...add some Test objects to the list
ObservableList observableList = ObservableCollections.observableList(testList);
JTable table = new JTable();
JTableBinding tableBinding = SwingBindings.createJTableBinding(AutoBinding.UpdateStrategy.READ_WRITE, observableList, table);
然后,我使用以下代码为测试对象的每个属性a,b和c添加绑定。 (注意这只是我使用的通用代码)
BeanProperty beanProperty = BeanProperty.create(properyName);
JTableBinding.ColumnBinding columnBinding = tableBinding.addColumnBinding(beanProperty);
columnBinding.setColumnName(columnName);
columnBinding.setColumnClass(clazz);
columnBinding.setEditable(editable);
现在这将正确显示表格,但是当我更新表格中的a或b时会出现问题。由于c是从a和b计算的,我希望c在其中一个值发生变化时更新。这不会发生。
我猜表需要刷新以反映实体的新值吗?
任何人都可以解释我需要做些什么来实现这一目标吗?我是否需要添加一些aditional beans绑定属性?
这是我正在使用的bean绑定库:
<dependency>
<groupId>org.jdesktop</groupId>
<artifactId>beansbinding</artifactId>
<version>1.2.1</version>
</dependency>
org.jdesktop.swingbinding.SwingBindings
答案 0 :(得分:1)
供参考,我们讨论了基本问题here,并为DefaultTableModel
和AbstractTableModel
引用了手动解决方案here。实际上,对a
或b
的更改必须通知TableModelListener
c
可能已更改的任何{{1}}。这可能有助于指导您搜索合适的bean绑定属性。
答案 1 :(得分:1)
在这个问题here的帮助下,我能够通过覆盖JTable上的setVale函数来获得所需的功能:
@Override
public void setValueAt(Object value, int row, int col)
{
super.setValueAt(value, row, col);
tableBinding.unbind();
tableBinding.bind();
revalidate();
}
感谢领导者trashgod
答案 2 :(得分:1)
Binding b = bindingGroup.getBindings().get(0);
b.unbind();
b.bind();
答案 3 :(得分:0)
更新或插入
后,只需写两行bindingGroup.unbind();
bindingGroup.bind();