2012-04-09 7 views
1

Gibt es eine Möglichkeit, ein beschnittenes AbstractTableModel von einem vollständigen AbstractTableModel ohne getValueAt() Komplikationen abzuleiten?Beschneiden eines AbstractTableModel ohne getValueAt() Komplikationen

Meine vollständigen Daten (einschließlich userIds) werden in ein JTable AbstractTableModel geladen. Für Anzeigezwecke möchte ich jedoch ein beschnittenes AbstractTableModel von Daten ableiten, die einer bestimmten userId zugeordnet sind.

Ich fange an zu denken, dass dies nicht möglich ist, weil getValueAt interveniert und IndexOutOfBounds Ausnahmen wirft? Diese Ausnahmen scheinen aufzutreten, da die bereinigten Daten nicht aufgefüllt sind.

public class PrunedUserIdTableModel extends AbstractTableModel { 

    TableModel fullModel; 
    List columnIdentifiers; 
    List tempDatum; 
    List tempData; // holds tempDatums 
    int rowCount; // reports pruned rowCount through getRowCount() method 
    List prunedData; // intended to hold data of matched userId rows 

    public PrunedUserIdTableModel(JTable fullTable, String userId) { 
     fullModel = fullTable.getModel(); 
     columnIdentifiers = new ArrayList(); 
     tempDatum = new ArrayList(); 
     tempData = new ArrayList(); 
     rowCount = 0; 

     List<Integer> userCount = new ArrayList<>(); 

     // Load columnIdentifiers from fullModel; omitted here 

     // Go through fullModel searching for rows with matching userIds 

     for (int i = 0; i < fullModel.getRowCount(); i++) { 
      for (int k = 0; k < fullModel.getColumnCount(); k++) { 
       tempDatum.add(fullModel.getValueAt(i,k); 
       if ((fullModel.getValueAt(i,k).equals(userId)) { 
        // Matching userId found; record relevant row 
        userCount.add(g); 
       } 
      } 
      tempData.add(tempDatum); 
      tempDatum.clear(); 
     } 

     // Now populate prunedData 
     for (int j = 0; j < userCount.size(); j++) { 
      prunedData.add(tempData.get(userCount.get(j))); 
      rowCount=rowCount+1; 
     } 

     fireTableChanged(null); 
    } 
    @Override 
    public int getRowCount() { 
     return rowCount; 
    } 
    @Override 
    public int getColumnCount() { 
     return fullModel.getColumnCount(); 
    } 
    @Override 
    public int getValueAt(int rowIndex, int columnIndex) { 
     // THROWS INDEX OUT OF BOUNDS EXCEPTION: Index 0; size 0 
     List rowList = (List)prunedData.get(rowIndex); 
     return rowList.get(columnIndex); 
    } 
} 

Antwort

4

ein TableRowSorter Verwenden Sie Ihre JTable Zeilen filtern, dass nur die, die Sie wollen zu zeigen. Rufen Sie dann unbedingt convertRowIndexToView und convertRowIndexToModel auf, wenn Sie auf einen Index verweisen.

Verwandte Themen