2013-10-31 73 views
1

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

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()和使用getDatos()但随后JTable中再不会出现还,还我检查了返回数组从heapSort()和它运行良好,数据与来自getDatos()的数据相同,但已订购。任何帮助,将非常感激,谢谢。

回答

3

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

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

所以行数应该基于datos对象中的行数。

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

getValueAt()方法不应该排序数据。模型中的数据应该已经排序。在创建模型时,可以对其进行排序或对其进行排序。那就是getValueAt()方法不应该改变数据的结构。同样,每当您更改数据时,您都需要采取措施。

+0

谢谢,Nodo [] datos对象不是用模型创建的,我用它来存储'heapSort()'中的有序数组,因此我不能使用'datos.length',因为不是在那时创建。另外,我只是修改了getValueAt()方法来显示:'datos = heap.getDatos();'这将返回一个已排序的数组,但仍然不会显示。奇怪的是,JTable在直接使用堆阵列时显示模型,而不是在订购时显示模型。 – hkimgt

+0

'所以我不能使用datos.length,因为那时还没有创建。“这是我的观点!应该在创建类时创建并包含有效的数据。 getValueAt()方法只做一件事,那就是从数据结构中获取值。它不会首先对数据结构进行排序。 – camickr

+0

'奇怪的是,JTable在直接使用堆阵列时显示模型,而不是当它被命令时显示模型 - 也许你的堆排序不符合你的期望。为什么你甚至有一个堆类?你的TableModel不应该包含两个数据结构来保存数据。只需使用Collections API为您排序即可。或者使用JTable的排序功能。 – camickr