【问题标题】:Infinite loop inside custom abstracttablemodel自定义abstracttablemodel中的无限循环
【发布时间】:2013-12-07 21:52:56
【问题描述】:

我的自定义表格模型中出现了无限循环。创建表后,此类中的两个 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;
    }
}

【问题讨论】:

    标签: java swing jtable infinite-loop


    【解决方案1】:

    您正在导致模型中的无限循环。您从getValueAt() 拨打setValueAt()。您对setValueAt() 的实现会触发fireTableCellUpdated。这会触发getValueAt()。并且循环重复。

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

    【讨论】:

      【解决方案2】:

      在你的类中添加一些静态计数器,初始化为 0。
      然后在其中一种方法中,增加
      每次调用该方法时计数器。一旦柜台
      达到 20 或 30 的值,然后抛出一个新的
      此方法中的 RuntimeException("TEST")。

      观察你得到的堆栈跟踪,它应该
      向您展示是什么造成了无限递归。

      递归可能是间接的,例如
      方法 A 调用方法 B 调用方法 C 调用方法 A
      因此不是很明显

      或者,您可以为同样的事情使用调试器。

      【讨论】:

        猜你喜欢
        • 2016-06-28
        • 2021-10-30
        • 1970-01-01
        • 1970-01-01
        • 2010-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多