2

这是我遇到的问题的一个简单示例。

我有一个简单的课程:

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 在其中一个值发生变化时更新。这不会发生。

我猜表需要刷新以反映实体的新值?

谁能解释我需要做些什么来实现这一点?我需要添加一些额外的 bean 绑定属性吗?

这是我正在使用的 bean 绑定库:

<dependency>
  <groupId>org.jdesktop</groupId>
  <artifactId>beansbinding</artifactId>
  <version>1.2.1</version>
</dependency>


org.jdesktop.swingbinding.SwingBindings
4

4 回答 4

1

作为参考,这里讨论了潜在的问题,这里DefaultTableModel和引用了手动解决方案AbstractTableModel。实际上,更改ab必须通知任何TableModelListener可能c已更改的内容。这可能有助于指导您搜索合适的 bean 绑定属性。

于 2013-02-09T02:21:38.713 回答
1

在此问题的帮助下我能够通过将 JTable 上的 setVale 函数覆盖为:

@Override
public void setValueAt(Object value, int row, int col)
{
    super.setValueAt(value, row, col);
    tableBinding.unbind();
    tableBinding.bind();
    revalidate();
}

谢谢大神指点

于 2013-02-10T00:56:49.380 回答
0

只需在更新或插入后写这两行

bindingGroup.unbind();
bindingGroup.bind();
于 2015-04-07T04:51:14.593 回答
0

我修了一点,这解决了问题;您不允许取消绑定主 bindingGroup,但您指定 jtablebinding 像这样更新它

Binding b = bindingGroup.getBindings().get(0);
b.unbind();
b.bind();
于 2015-04-08T00:19:24.040 回答