更新后刷新JTable

时间:2013-02-08 21:26:56

标签: java swing user-interface binding beans-binding

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

我有一个简单的课程:

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

4 个答案:

答案 0 :(得分:1)

供参考,我们讨论了基本问题here,并为DefaultTableModelAbstractTableModel引用了手动解决方案here。实际上,对ab的更改必须通知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)

我解决了一下 这解决了问题;你不允许取消绑定主绑定组,但你指定jtablebinding来像这样更新它

Binding b = bindingGroup.getBindings().get(0);
b.unbind();
b.bind();

答案 3 :(得分:0)

更新或插入

后,只需写两行
bindingGroup.unbind();
bindingGroup.bind();