Java 自定义表模型不工作

Java 自定义表模型不工作,java,swing,jtable,tablemodel,abstracttablemodel,Java,Swing,Jtable,Tablemodel,Abstracttablemodel,我编写了一个自定义表格模型。它的目标是将值绑定到列表。此列表在整个应用程序中使用。如果在表中进行了更改,则该更改也会反映在应用程序中的任何其他位置。我的问题是,我的表JTable不显示行 这是我的第一个自定义表格模型,所以我不确定是否遗漏了什么 该表是使用以下代码创建的: public CBTable(List<T> elements, Class<T> classType) { super(new BindingTableModel(elements));

我编写了一个自定义表格模型。它的目标是将值绑定到列表。此列表在整个应用程序中使用。如果在表中进行了更改,则该更改也会反映在应用程序中的任何其他位置。我的问题是,我的表JTable不显示行

这是我的第一个自定义表格模型,所以我不确定是否遗漏了什么

该表是使用以下代码创建的:

public CBTable(List<T> elements, Class<T> classType) {
    super(new BindingTableModel(elements));
    this.tableModel = (BindingTableModel<T>) getModel();
    this.classType = classType; 
    setBindings();
    repaint();
}
实际模型本身是这样的:

public class BindingTableModel<T> extends AbstractTableModel  implements TableModel {

    private List<T> elements;
    private List<BindingTableModelInfo> bindingInfo;

    private Map<Point, Object> valueMap;

    public BindingTableModel(List<T> elements) {
        this.elements = elements;
        this.bindingInfo = new ArrayList<>();
        valueMap = new HashMap<>();
        bind();
        for(int i = 0; i < getRowCount(); i++){
            fireTableRowsInserted(i, i);
        }    
        fireTableStructureChanged();
    }

    public void addBindingInfo(String propertyName, String columnName, Class colClass, boolean isEditable) {
        bindingInfo.add(new BindingTableModelInfo(propertyName,
                columnName,
                colClass,
                isEditable));
    }

    private void bind() {
        for (int col = 0; col < getColumnCount(); col++) {
            for (int row = 0; row < getRowCount(); row++) {
                getValueAt(row, col);//this will init the map
            }
        }
    }

    public void addElement(T element){
        elements.add(element);
    }

    public List<T> getElements(){
        return elements;
    }

    public void removeElement(T element){
        int index = elements.indexOf(element);
        elements.remove(element);
        fireTableRowsDeleted(index, index);
    }

    @Override
    public int getRowCount() {
        return elements.size();
    }

    @Override
    public int getColumnCount() {
        return bindingInfo.size();
    }

    @Override
    public String getColumnName(int i) {
        return bindingInfo.get(i).getColumnName();
    }

    @Override
    public Class<?> getColumnClass(int i) {
        return bindingInfo.get(i).getColumnClass();
    }

    @Override
    public boolean isCellEditable(int row, int col) {
        return bindingInfo.get(col).isIsEditable();

    }

    @Override
    public Object getValueAt(int row, int col) {
        Point point = new Point(row, col);
        if (valueMap.containsKey(point)) {
            return valueMap.get(point);
        }
        String property = bindingInfo.get(col).getProperty();
        Class classType = bindingInfo.get(col).getColumnClass();
        T element = elements.get(row);
        Object retVal = Pojo.getValueByName(classType, element, property);
        valueMap.put(point, retVal);
        return retVal;
    }

    @Override
    public void setValueAt(Object value, int row, int col) {
        Point point = new Point(row, col);
        if (valueMap.containsKey(point)) {
            Object oldValue = valueMap.get(point);
            if (oldValue != null && oldValue.equals(value)) {
                return;
            }
        }
        String property = bindingInfo.get(col).getProperty();
        Class classType = bindingInfo.get(col).getColumnClass();
        T element = elements.get(row);
        Pojo.setValueByName(classType, element, property, value);
    }


}
公共类BindingTableModel扩展AbstractTableModel实现TableModel{
私有列表元素;
私有列表绑定信息;
私人地图价值地图;
公共BindingTableModel(列表元素){
这个元素=元素;
this.bindingInfo=newArrayList();
valueMap=newhashmap();
bind();
对于(int i=0;i
确保
fireTableCellUpdated()
或其他适当的事件;这通常是在
setValueAt()的实现中完成的。


完整的例子都可以看到。

你在哪里
fireTable*Updated()
?这是个好问题,我不知道。这通常发生在哪里?@trashgood我在模型的构造函数中添加了火灾事件。无影响:(在构造函数中创建一个“tableModel”变量,然后使用一个“dataModel”变量设置表的模型。我认为这是错误的。在构造函数中不需要fireXXX事件,表。setModel(…)将导致重新绘制表。但是,您确实需要调用fireXXX(…)更新TableModel中数据的其他方法中的语句,例如setValueAt(…)方法。@user489041:我已经在下面详细阐述了。
public class BindingTableModel<T> extends AbstractTableModel  implements TableModel {

    private List<T> elements;
    private List<BindingTableModelInfo> bindingInfo;

    private Map<Point, Object> valueMap;

    public BindingTableModel(List<T> elements) {
        this.elements = elements;
        this.bindingInfo = new ArrayList<>();
        valueMap = new HashMap<>();
        bind();
        for(int i = 0; i < getRowCount(); i++){
            fireTableRowsInserted(i, i);
        }    
        fireTableStructureChanged();
    }

    public void addBindingInfo(String propertyName, String columnName, Class colClass, boolean isEditable) {
        bindingInfo.add(new BindingTableModelInfo(propertyName,
                columnName,
                colClass,
                isEditable));
    }

    private void bind() {
        for (int col = 0; col < getColumnCount(); col++) {
            for (int row = 0; row < getRowCount(); row++) {
                getValueAt(row, col);//this will init the map
            }
        }
    }

    public void addElement(T element){
        elements.add(element);
    }

    public List<T> getElements(){
        return elements;
    }

    public void removeElement(T element){
        int index = elements.indexOf(element);
        elements.remove(element);
        fireTableRowsDeleted(index, index);
    }

    @Override
    public int getRowCount() {
        return elements.size();
    }

    @Override
    public int getColumnCount() {
        return bindingInfo.size();
    }

    @Override
    public String getColumnName(int i) {
        return bindingInfo.get(i).getColumnName();
    }

    @Override
    public Class<?> getColumnClass(int i) {
        return bindingInfo.get(i).getColumnClass();
    }

    @Override
    public boolean isCellEditable(int row, int col) {
        return bindingInfo.get(col).isIsEditable();

    }

    @Override
    public Object getValueAt(int row, int col) {
        Point point = new Point(row, col);
        if (valueMap.containsKey(point)) {
            return valueMap.get(point);
        }
        String property = bindingInfo.get(col).getProperty();
        Class classType = bindingInfo.get(col).getColumnClass();
        T element = elements.get(row);
        Object retVal = Pojo.getValueByName(classType, element, property);
        valueMap.put(point, retVal);
        return retVal;
    }

    @Override
    public void setValueAt(Object value, int row, int col) {
        Point point = new Point(row, col);
        if (valueMap.containsKey(point)) {
            Object oldValue = valueMap.get(point);
            if (oldValue != null && oldValue.equals(value)) {
                return;
            }
        }
        String property = bindingInfo.get(col).getProperty();
        Class classType = bindingInfo.get(col).getColumnClass();
        T element = elements.get(row);
        Pojo.setValueByName(classType, element, property, value);
    }


}
@Override
public void setValueAt(Object value, int row, int col) {
    …
    fireTableCellUpdated(row, col);
}