2013-10-31 114 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