2010-05-30 6 views
6

Je veux stocker les résultats de la lecture de l'index lucene dans jTable, afin que je puisse le rendre triable par différentes colonnes. De l'index je lis des termes avec différentes mesures de leurs fréquences.create TableModel et remplir dynamiquement jTable

colonnes de table sont celles-ci: [terme string] [int absFrequency] [int docFrequency] [double invFrequency]

donc i dans AbstractTableModel je peux définir les noms de colonnes, mais je ne sais pas comment obtenir l'objet [ ] [] données avec les résultats de la méthode suivante:

public static void FrequencyMap(Directory indexDir) throws Exception 
{   
     List<ArrayList>redoviLista = new ArrayList<ArrayList>(); 


     //final Map<String,TermRow> map = new TreeMap<String,TermRow>(); 
     List<String>termList = new ArrayList<String>(); 

     IndexReader iReader = IndexReader.open(indexDir); 
     FilterIndexReader fReader = new FilterIndexReader(iReader); 

     int numOfDocs = fReader.numDocs(); 
     TermEnum terms = fReader.terms(); 

     while (terms.next()){ 
      Term term = terms.term(); 
      String termText = term.text(); 
      termList.add(termText); 

//Calculating the frequencies 
      int df = iReader.docFreq(term); 
      double idf = 0.0F; 
      idf = Math.log10((double) numOfDocs/df); 
      double tfidf = (df*idf); 

    //Here comes important part 
      //Changes according to takoi's answer 
     ArrayList<Object> oneRow = new ArrayList<Object>(); 
      oneRow.add(termText); 
      oneRow.add(df); 
      oneRow.add(idf); 
      oneRow.add(tfidf); 
      redoviLista.add(oneRow); 


     } 
     iReader.close(); 
    // So I need something like this, and i Neeed this array to be stored out of this method 

Je suis kindda coincé ici pour procéder à la mise en œuvre AbstractTableModel et remplir et afficher ce tableau ....:/

S'il vous plaît aider!

Répondre

5

Lorsque vous insérez, la suppression ou la mise à jour des données dans votre modèle, vous devez informer l'interface graphique de les changements. Vous pouvez le faire avec le feu -methods dans le AbstractTableModel.

I.e. Si vous ajoutez un élément à votre liste, vous devez également appeler fireTableRowsInserted(int firstRow, int lastRow) pour que le calque visible puisse être mis à jour.

Jetez un oeil à addElement(MyElement e) dans le code ci-dessous:

public class MyModel extends AbstractTableModel { 

    private static final String[] columnNames = {"column 1", "column 2"}; 
    private final LinkedList<MyElement> list; 

    private MyModel() { 
     list = new LinkedList<MyElement>(); 
    } 

    public void addElement(MyElement e) { 
     // Adds the element in the last position in the list 
     list.add(e); 
     fireTableRowsInserted(list.size()-1, list.size()-1); 
    } 

    @Override 
    public int getColumnCount() { 
     return columnNames.length; 
    } 

    @Override 
    public int getRowCount() { 
     return list.size(); 
    } 

    @Override 
    public Object getValueAt(int rowIndex, int columnIndex) { 
     switch(columnIndex) { 
      case 0: return list.get(rowIndex).getColumnOne(); 
      case 1: return list.get(rowIndex).getColumnOne(); 
     } 
     return null; 
    } 

} 
+0

Merci beaucoup tellement! – Julia

1

Vous n'avez pas besoin de créer un objet [] []. Il suffit de faire vos redoviLista une liste de listes:

redoviLista.add(new ArrayList<Object>(termText, df, idf, tfidf)); #pseudocode 

vous mettre en œuvre getValueAt comme ceci:

getValueAt(int row, int column){ 
    redoviLista.get(row).get(column); 
} 
+0

HI! Merci pour votre aide! J'ai essayé de le faire comme ça mais aucun résultat n'est affiché. Cela ne devrait pas poser de problème avec ma méthode, car elle renvoie les résultats, je peux les imprimer. J'ai donc adopté le code ci-dessus pour vous permettre de vérifier si vous aviez cela en tête? Plus la méthode: public Object getValueAt (int row, colonne int) { \t \t return redoviLista.get (ligne) .get (colonne); \t \t} – Julia

2

Il n'y a pas besoin de créer un TableModel personnalisé pour cela. Utilisez simplement le DefaultListModel. Le DefaultListModel vous permet d'ajouter dynamiquement des lignes au modèle en utilisant la méthode addRow (...) et il appelle automatiquement la méthode fireXXX appropriée pour indiquer à la table de se repeindre.

Le code de base serait:

DefaultTableModel model = new DefaultTableModel(columnNames); 

while (...) 
{ 
    Vector row = new Vector(); 
    row.add(...) 
    row.add(...) 
    model.addRow(row); 
} 

JTable table = new JTable(model); 

Vous n'avez pas besoin de créer un à chaque fois TableModel personnalisé. Parfois, vous pouvez commencer avec DefaultTableModel.