Java 是否可以侦听JTable中指定列上的数据更改?
我正在用一种类似excel的公式做一个JTable,因为有些单元格是自动计算的 我使用TableModelListener来监听数据更改,并在那里调用一个函数来循环所有数据并计算每行的值,如下所示 我在计算第3列“uds”,它包含一个由列块给出的整数。例如,如果工件的值为“3”,则uds应为“1”,或者如果工件的值为“3-5”,则uds应为“2” 表格模型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
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();
}
}