java - BindingBeans 中的复合值未更新

标签 java swing jtable beans-binding

我有一个简单的 POJO,如下所示:

class A{
    private int a;
    private int b;

    public int getC(){
        return a + b;
    }

    //getters and setters for a and b
}

该实体使用 BindingBeans 绑定(bind)到 JTable。对 a 和 b 所做的任何更改都会正确处理并显示在 JTable 中,但是 c 不会更新。

我认为如果 a 或 b 更新,我需要触发属性更改事件或其他事件,但确实没有想法。有什么想法吗?

编辑:

我创建了一个简单的示例:

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.io.Serializable;


public class POJO implements Serializable{

    private static final Gson gson = new GsonBuilder().create();

    private Integer a;
    private Integer b;

    public Integer getC() {
        return a + b;
    }

    public Integer getA() {
        return a;
    }

    public void setA(Integer a) {
        this.a = a;
    }

    public Integer getB() {
        return b;
    }

    public void setB(Integer b) {
        this.b = b;
    }

    @Override
    public String toString(){
        return gson.toJson(this);
    }
}

和主类

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTable;
import org.jdesktop.beansbinding.AutoBinding;
import org.jdesktop.beansbinding.BeanProperty;
import org.jdesktop.swingbinding.JTableBinding;
import org.jdesktop.swingbinding.SwingBindings;


public class Example implements ActionListener{

    private JTable table;
    private JFrame frame;
    private JTableBinding tableBinding;
    private List<POJO> elements;

    public static void main(String [] args){
        new Example();
    }

    public Example(){
        initData();
        initGui();
        initBindings();
        frame.pack();
    }

    private void initData(){
        elements = new ArrayList<POJO>();
        POJO pojoA = new POJO();
        pojoA.setA(1);
        pojoA.setB(2);
        POJO pojoB = new POJO();
        pojoB.setA(3);
        pojoB.setB(4);
        elements.add(pojoA);
        elements.add(pojoB);
    }

    private void initGui(){
         frame = new JFrame();
         table = new JTable();
         frame.getContentPane().setLayout(new BorderLayout());
         JPanel tablePanel = new JPanel();
         tablePanel.setLayout(new GridLayout());
         tablePanel.add(table);
         frame.getContentPane().add(BorderLayout.CENTER,tablePanel);
         JButton button = new JButton("Show Current Elements");
         button.addActionListener(this);
         frame.getContentPane().add(BorderLayout.SOUTH,button);
         frame.setLocationRelativeTo(null);
         frame.setVisible(true);
         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    private void initBindings(){
        tableBinding = SwingBindings.createJTableBinding(
                AutoBinding.UpdateStrategy.READ_WRITE, elements,
                table);
        addBinding("a", "A", Integer.class, true);
        addBinding("b", "B", Integer.class, true);
        addBinding("c", "C", Integer.class, false);
        tableBinding.bind();
    }

    private void addBinding(String properyName, String columnName, Class clazz, boolean editable) {
        BeanProperty beanProperty = BeanProperty.create(properyName);
        JTableBinding.ColumnBinding columnBinding = tableBinding.addColumnBinding(beanProperty);
        columnBinding.setColumnName(columnName);
        columnBinding.setColumnClass(clazz);
        columnBinding.setEditable(editable);
    }

    public void actionPerformed(ActionEvent ae) {
        StringBuilder builder = new StringBuilder();
        for(POJO pojo : elements){
            builder.append(pojo.toString() + "\n");
        }
        JOptionPane.showMessageDialog(null, "The elements are:\n\n" + builder.toString());
    }
}

最佳答案

为了拥有正确的 bean,您需要触发事件

private final PropertyChangeSupport = new PropertyChangeSupport( this );

public void setA(Integer a) {
  Integer old = this.a;
  this.a = a;
  propertyChangeSupport.firePropertyChange( "A", old, this.a );
}

C 是派生属性。不确定如果你只有 getter 没有 setter 是否会起作用。但您很可能需要触发一个事件,以防 C 也发生变化。由于当 A 或 B 更改时它会更改,因此我会将其 setter 更新为

public void setA(Integer a) {
  Integer oldA = this.a;
  Integer oldC = getC();
  this.a = a;
  propertyChangeSupport.firePropertyChange( "A", oldA, this.a );
  propertyChangeSupport.firePropertyChange( "C", oldC, getC() );
}

这当然也适用于 B 属性。

但正如前面所评论的,我对那个绑定(bind)框架没有经验。所以不确定这是否能解决您的问题,而且我还没有测试它(不打算首先下载/安装该框架)。

关于java - BindingBeans 中的复合值未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28881741/

相关文章:

java - 将 boolean 值从字符串更改为复选框(JTable)

java - Color.getColor(String, int) - 随机颜色

java - 如何在多个 jpanel 中使用一个变量?

java - java中如何同时运行两个框架

java - 在 JTable 中反转选择

java - JTable 渲染在替换行时中断

java - 有没有办法使用 JPA 存储库方法关键字来搜索列中的术语列表?

java - 自定义从 Html 字符串引用的图像

java - 最佳实践 : when to load data from remote DB

java - 基于 Swing 的应用程序的 Eclipse 或 Netbeans?