2013-02-08 157 views
2

这是我遇到的问题的一个简单示例。更新后刷新JTable

我有一个简单的类:

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,和测试对象的温度。 (注意:这只是普通的代码,我用)

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 bean绑定属性?

这里是豆绑定库我使用:

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


org.jdesktop.swingbinding.SwingBindings 
+0

你使用哪种SwingBindings? – MadProgrammer 2013-02-08 22:39:50

+0

@MadProgrammer你的意思是图书馆?我对该信息进行了更新 – user489041 2013-02-08 22:43:18

+0

是的,谢谢你:D – MadProgrammer 2013-02-08 22:52:17

回答

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

+0

我看到''JTableBinding'通过在目标'JTable'上安装自定义模型来工作。“我想知道'refresh()'和'bind()/ unbind()'一样好吗? 'revalidate()'不应该被要求。 – trashgod 2013-02-10 02:48:40

+0

我尝试删除绑定/解除绑定,并将其替换为在JTableBinding上进行刷新的调用。这并没有更新复合列(如果这是合适的术语)。我认为是在同一页面上,这可能不是正确的方式来做到这一点(绑定/解除绑定的方式)。 – user489041 2013-02-10 03:11:09

+0

是的,这似乎有点霸道。有什么方法可以重写'JTableBinding.BindingTableModel'中的'setValueAt()'? – trashgod 2013-02-10 03:29:51

1

作为参考,潜在的问题进行了讨论here,和手动解决方案援引here两个DefaultTableModelAbstractTableModel。实际上,更改为ab必须通知任何TableModelListenerc可能已更改。这可能有助于引导您搜索合适的bean绑定属性。

+0

我很欣赏这些线索,但我仍然对这个问题非常感兴趣。解决方案是否需要重写getVale函数,或者它是否需要以某种方式刷新表格?任何帮助将不胜感激。 – user489041 2013-02-09 23:34:19

+0

重要的是当'a'或'b'发生变化时触发包含'c'的'TableModelEvent'; 'setValueAt()'中的'fireTableRowsUpdated()'是一个简单的权宜之计。 – trashgod 2013-02-10 00:06:10

+0

它看起来像JTableBinding使用的表模型不会扩展AbstractTabelModel。我不知道如果解雇这个事件将会发生 – user489041 2013-02-10 00:24:31

0

只要写这两条线更新或插入后

bindingGroup.unbind(); 
bindingGroup.bind(); 
+0

请解释代码的作用,而不是只发布代码。 – 2015-04-07 05:37:20

+0

这段代码是解绑并绑定bindingGroup刷新jtable的内容,但我添加了另一个关于使用jtablebinding而不是使用绑定组的注释;因为bindingGroup.unbind(); bindingGroup.bind();在某些情况下会出现错误,因此当绑定到jtable的列表发生更改时,您需要通过调用jtablebinding的解除绑定来更新或刷新与该jtable的绑定,然后调用jtablebinding.bind();为jtable更新新数据 – 2015-04-10 02:05:09

1

我修好了一下 这个解决了这个问题;你不允许解除绑定主bindingGroup,但你指定jtablebinding来更新它像这样

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

好主意!我会尝试一下 – user489041 2015-04-08 13:27:35