自定义abstracttablemodel中的无限循环

时间:2013-12-07 21:52:56

标签: java swing jtable infinite-loop

我在自定义表模型中获得了一个无限循环。创建表后,将重复打印此类中的两个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;
    }
}

2 个答案:

答案 0 :(得分:4)

您正在模型中引发无限循环。您从setValueAt()致电getValueAt()。您setValueAt()的实施会触发fireTableCellUpdated。这会触发getValueAt()。循环重复。

您不应该真正更新getValueAt()方法中的表格,当然也不应该调用setValueAt()。有关表模型实现的一些示例,请参阅How To Use Tables

答案 1 :(得分:0)

在您的班级中添加一些静态计数器,初始化为0 然后在你要求的其中一种方法中,增加
每次调用方法时都会计数器。一旦柜台
达到20或30的值,然后扔一个新的 此方法中的RuntimeException(“TEST”)
观察你得到的堆栈跟踪,它应该是 告诉你什么创造了无尽的递归
递归可能是间接的,例如
方法A调用方法B调用方法C调用方法A
因此不是很明显
或者,您可以使用调试器来实现相同的功能。