Java 是否可以侦听JTable中指定列上的数据更改?

Java 是否可以侦听JTable中指定列上的数据更改?,java,swing,jtable,listener,stack-overflow,Java,Swing,Jtable,Listener,Stack Overflow,我正在用一种类似excel的公式做一个JTable,因为有些单元格是自动计算的 我使用TableModelListener来监听数据更改,并在那里调用一个函数来循环所有数据并计算每行的值,如下所示 我在计算第3列“uds”,它包含一个由列块给出的整数。例如,如果工件的值为“3”,则uds应为“1”,或者如果工件的值为“3-5”,则uds应为“2” 表格模型 public class PresupuestoModel extends AbstractTableModel { privat

我正在用一种类似excel的公式做一个JTable,因为有些单元格是自动计算的

我使用TableModelListener来监听数据更改,并在那里调用一个函数来循环所有数据并计算每行的值,如下所示

我在计算第3列“uds”,它包含一个由列块给出的整数。例如,如果工件的值为“3”,则uds应为“1”,或者如果工件的值为“3-5”,则uds应为“2”

表格模型

public class PresupuestoModel extends AbstractTableModel {

    private String[] cols = { "Description", "Pieces", "PVP U", "Uds", "Total", "Done" };
    private Vector<Object[]> data;

    public PresupuestoModel() {
        setData(new Vector<Object[]>());
    }

    public void addRow() {
        Object[] s = new Object[getCols().length];

        for (int i = 0; i < getCols().length; i++) {
            if (i != getCols().length - 1)
                s[i] = "";
            else
                s[i] = new Boolean(false);
        }

        getData().add(s);
        fireTableRowsInserted(getRowCount() - 1, getColumnCount());
    }

    public void deleteRow(int index) {
        getData().remove(index);
        fireTableRowsDeleted(index, index);
    }

    public String getColumnName(int n) {
        return getCols()[n];
    }

    public boolean isCellEditable(int row, int col) {
        if ((col == 3) || (col == 4)) 
            return false;
        else 
            return true;
    }

    public Class<?> getColumnClass(int c) {
        if (c == getCols().length - 1) {
            return Boolean.class;
        }
        else if((c == 2) || (c == 3)) {
            return Integer.class;
        }
        else { 
            return String.class;
        }
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        return (getData().get(rowIndex))[columnIndex];
    }

    public void setValueAt(Object value, int row, int col) {
        System.out.println("Object: " + value + "." + value.getClass()+ "[" + row + "," + col + "]");
        if(col == getCols().length - 1) {
            (getData().get(row))[col] = value;
        }
        else if((col > 1) || (col < 5))  {
            (getData().get(row))[col] = value;
        }
        else {
            (getData().get(row))[col] = value.toString();
        }
        fireTableDataChanged();
    }

    @Override
    public int getColumnCount() {
        return getCols().length;
    }

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

    public String[] getCols() {
        return cols;
    }

    public void setCols(String[] cols) {
        this.cols = cols;
    }

    public Vector<Object[]> getData() {
        return data;
    }

    public void setData(Vector<Object[]> data) {
        this.data = data;
    }

}
公共类PrespuestoModel扩展了AbstractTableModel{
私有字符串[]cols={“描述”、“碎片”、“PVP U”、“Uds”、“总计”、“完成”};
专用矢量数据;
公共模型(){
setData(新向量());
}
public void addRow(){
Object[]s=新对象[getCols().length];
for(int i=0;i1)| |(列<5)){
(getData().get(row))[col]=值;
}
否则{
(getData().get(row))[col]=value.toString();
}
fireTableDataChanged();
}
@凌驾
public int getColumnCount(){
返回getCols().length;
}
@凌驾
public int getRowCount(){
返回getData().size();
}
公共字符串[]getCols(){
返回cols;
}
公共void setCols(字符串[]cols){
this.cols=cols;
}
公共向量getData(){
返回数据;
}
公共数据(矢量数据){
这个数据=数据;
}
}

TableModelEvent参数有一个
getColumn()
方法,该方法将告诉您正在更改并导致事件的列。您可以使用if块,检查此方法返回的int,如果忽略列,只需调用
return

public void tableChanged(TableModelEvent event) {
    if (event.getColumn() == COLUMN_TO_IGNORE) {
        return;
    } else {
        maths();
    }
}

GETCalpNo()总是返回-1,为什么?@弗兰克维奇:考虑创建和发布A,这样我们就可以自己运行和测试代码了。请阅读链接。@Frankovich:per,-1对应于
TableModelEvent。所有列都是
常量值。现在来找出原因……谢谢!,我找到了原因,我在
setValueAt(Object o,int row,int col)
调用
fireTableDataChanged()
并将其更改为
fireTableCellUpdated(row,col)
现在返回正确的列TableModelEvent@Frankovich:这很有道理。谢谢你的更新!
public class PresupuestoModel extends AbstractTableModel {

    private String[] cols = { "Description", "Pieces", "PVP U", "Uds", "Total", "Done" };
    private Vector<Object[]> data;

    public PresupuestoModel() {
        setData(new Vector<Object[]>());
    }

    public void addRow() {
        Object[] s = new Object[getCols().length];

        for (int i = 0; i < getCols().length; i++) {
            if (i != getCols().length - 1)
                s[i] = "";
            else
                s[i] = new Boolean(false);
        }

        getData().add(s);
        fireTableRowsInserted(getRowCount() - 1, getColumnCount());
    }

    public void deleteRow(int index) {
        getData().remove(index);
        fireTableRowsDeleted(index, index);
    }

    public String getColumnName(int n) {
        return getCols()[n];
    }

    public boolean isCellEditable(int row, int col) {
        if ((col == 3) || (col == 4)) 
            return false;
        else 
            return true;
    }

    public Class<?> getColumnClass(int c) {
        if (c == getCols().length - 1) {
            return Boolean.class;
        }
        else if((c == 2) || (c == 3)) {
            return Integer.class;
        }
        else { 
            return String.class;
        }
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        return (getData().get(rowIndex))[columnIndex];
    }

    public void setValueAt(Object value, int row, int col) {
        System.out.println("Object: " + value + "." + value.getClass()+ "[" + row + "," + col + "]");
        if(col == getCols().length - 1) {
            (getData().get(row))[col] = value;
        }
        else if((col > 1) || (col < 5))  {
            (getData().get(row))[col] = value;
        }
        else {
            (getData().get(row))[col] = value.toString();
        }
        fireTableDataChanged();
    }

    @Override
    public int getColumnCount() {
        return getCols().length;
    }

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

    public String[] getCols() {
        return cols;
    }

    public void setCols(String[] cols) {
        this.cols = cols;
    }

    public Vector<Object[]> getData() {
        return data;
    }

    public void setData(Vector<Object[]> data) {
        this.data = data;
    }

}
public void tableChanged(TableModelEvent event) {
    if (event.getColumn() == COLUMN_TO_IGNORE) {
        return;
    } else {
        maths();
    }
}