我在自定义表模型中获得了一个无限循环。创建表后,将重复打印此类中的两个println语句。有这样的原因吗?
此外,还有其他println语句应该执行,但不要,即使它们正在监视的功能确实发生。
package client.mainwindow;
import javax.swing.table.AbstractTableModel;
public class IndexerTableModel extends AbstractTableModel {
private BatchState bs;
public IndexerTableModel(BatchState bs){
this.bs = bs;
}
@Override
public int getColumnCount(){
int count = bs.getDlr().getNumFields() + 1;
System.out.println("getColumnCount");//HERE
return count;
}
@Override
public String getColumnName(int column){
String result = null;
if(column == 0){
result = "Record Number";
}else if(column >= 0 && column < getColumnCount()){
result = bs.getDlr().getTitles().get(column - 1);
}
return result;
}
@Override
public int getRowCount() {
return bs.getDlr().getNumRecords();
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
Object result = null;
if(isCellEditable(rowIndex, columnIndex)){
Cell cell = new Cell(rowIndex, columnIndex);
result = bs.getValue(cell);
}else if(columnIndex == 0){
for(int i = 0; i<getRowCount(); i++){
setValueAt(i, i, 0);
}
}
System.out.println("getValueAt");//HERE
return result;
}
@Override
public void setValueAt(Object value, int row, int column){
if(isCellEditable(row, column)){
Cell cell = new Cell(row, column);
bs.setValue(cell, value);
}
this.fireTableCellUpdated(row, column);
}
@Override
public boolean isCellEditable(int row, int column){
boolean edible = false;
if(column == 0 && column < getColumnCount() && row >= 0 && row < getRowCount())
edible = false;
else if(column > 0 && column < getColumnCount() && row >= 0 && row < getRowCount())
edible = true;
return edible;
}
}
答案 0 :(得分:4)
您正在模型中引发无限循环。您从setValueAt()
致电getValueAt()
。您setValueAt()
的实施会触发fireTableCellUpdated
。这会触发getValueAt()
。循环重复。
您不应该真正更新getValueAt()
方法中的表格,当然也不应该调用setValueAt()
。有关表模型实现的一些示例,请参阅How To Use Tables。
答案 1 :(得分:0)
在您的班级中添加一些静态计数器,初始化为0
然后在你要求的其中一种方法中,增加
每次调用方法时都会计数器。一旦柜台
达到20或30的值,然后扔一个新的
此方法中的RuntimeException(“TEST”)
观察你得到的堆栈跟踪,它应该是
告诉你什么创造了无尽的递归
递归可能是间接的,例如
方法A调用方法B调用方法C调用方法A
因此不是很明显
或者,您可以使用调试器来实现相同的功能。