AbstractTableModel不会更新JTable

时间:2013-10-31 19:15:55

标签: java swing jtable tablemodel abstracttablemodel

我正在尝试让我的JTable显示对我的TableModel进行的更改,扩展AbstractTableModel。我做了一个Heap来插入所有文件,然后我在我的堆数组上应用了一个heapSort,所以这个有序数组应该是我的TableModel数据。它看起来像这样:

public class ModeloTabla extends AbstractTableModel {

    private Heap heap;
    private Nodo[] datos;

    @Override
    public int getRowCount() {
        return heap.getNumNodos();
    }

    @Override
    public int getColumnCount() {
        return 4;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        if ( !heap.empty() ) {
            datos = heap.heapSort();
        }
        Documento doc = datos[rowIndex].getDocumento();
        switch ( columnIndex ) {
            case 0:
                return doc.getNombre();
            case 1:
                return doc.getHojas();
            case 2:
                return doc.getPrioridad();
            default:
                return null;
        }
    }
}

当我调用getValueAt时,heap.heapSort()方法内部会破坏堆内部数组,并返回带有有序节点的Nodo[]。因此,当datos具有带节点的有序数组时,我的JTable将不会显示数据。现在,如果我不执行heap.heapSort()而只是从堆中调用无序数组,我的JTable会显示所有内容。

@Override
public Object getValueAt(int rowIndex, int columnIndex) {
        datos = heap.getDatos();
        Documento doc = datos[rowIndex].getDocumento();
        ... //This works but datos is unordered
    }
}

我已经尝试用heapSort()中的有序数组替换Heap无序数组并使用getDatos()返回它,但是JTable再次不会显示,我也检查了返回来自heapSort()的数组并且运行良好,数据与getDatos()中的数据相同但是有序。对此有任何帮助,非常感谢,谢谢。

1 个答案:

答案 0 :(得分:3)

在getValueAt()方法中,您正在从数据对象中检索数据。

  

Documento doc = datos [rowIndex] .getDocumento();

因此,行数应基于数据对象中的行数。

public int getRowCount() {
        //return heap.getNumNodos();
        return datos.length;
    }

getValueAt()方法不应该对数据进行排序。模型中的数据应该已经排序。在外部排序或在创建模型时对其进行排序。也就是说,getValueAt()方法不应该改变数据的结构。每次更改数据时,您都需要求助。