Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使绑定的JTable保持最新?_Java_Binding_Refresh_Jtable - Fatal编程技术网

Java 如何使绑定的JTable保持最新?

Java 如何使绑定的JTable保持最新?,java,binding,refresh,jtable,Java,Binding,Refresh,Jtable,我使用绑定JTable来显示实体列表 // selSteps is a List of entities. selStepsBound = ObservableCollections.observableList(selSteps); JTableBinding jTableBinding = SwingBindings.createJTableBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.R

我使用绑定JTable来显示实体列表


    // selSteps is a List of entities.
    selStepsBound = ObservableCollections.observableList(selSteps);

    JTableBinding jTableBinding = SwingBindings.createJTableBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, selStepsBound, tblSelSteps, "tblSelStepsBinding");
    ColumnBinding columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${steporder}"));
    columnBinding.setColumnName("Order");
    columnBinding.setColumnClass(Integer.class);
    columnBinding.setEditable(false);
    columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${name}"));
    columnBinding.setColumnName("Description");
    columnBinding.setColumnClass(String.class);
    bindingGroup.addBinding(jTableBinding);
    jTableBinding.bind();

    bindingGroup.bind();
这可以很好地显示原始数据。我甚至可以从绑定的observableList中删除项目,并自动更新JTable UI

问题是,当我更改实体的属性值时,该值不会反映在JTable UI中


如何将更改通知JTable?

我对SwingBindings的内容不太熟悉,但似乎您的列表是可观察的(即,将通知侦听器更改),但您的实体不是。所以没有人在听你的实体的变化

我通常通知JTable其中一个实体发生更改的方式是从表的模型中触发TableModelEvent。这就是JTable为更新自身而监听的内容。我通常从ABstractTableModel进行扩展,这样我就可以调用fireTableCellUpdated(row,col)等漂亮的函数。但是,我不太确定这个策略如何与SwingBindings的东西相结合……

您需要向实体添加“属性更改支持”。所以添加一个成员变量

final private PropertyChangeSupport changeSupport = new PropertyChangeSupport(this);
方法

public void addPropertyChangeListener(PropertyChangeListener listener) {
    changeSupport.addPropertyChangeListener(listener);
}

public void removePropertyChangeListener(PropertyChangeListener listener) {
    changeSupport.removePropertyChangeListener(listener);
}   
然后在每个setter中,添加一行类似于此的内容

    changeSupport.firePropertyChange("myProperty", oldMyProperty, myProperty);       
e、 g。 公共void setTotalWeight(整数totalWeight){

    Integer oldTotalWeight = this.totalWeight;

    this.totalWeight = totalWeight;

    changeSupport.firePropertyChange("totalWeight", oldTotalWeight, totalWeight);           
}