2010-05-30 5 views
6

Ich möchte die Ergebnisse des Lesens Lucene Index in jTable speichern, so dass ich es sortierbar machen kann durch verschiedene Spalten. Vom Index lese ich Begriffe mit verschiedenen Maßen ihrer Frequenzen.create TableModel und befüllen jTable dynamisch

Tabellenspalten sind diese: [string Begriff] [int absFrequency] [int docFrequency] [double invFrequency]

Also i Abstract kann ich Spaltennamen definieren, aber ich weiß nicht, wie das Objekt erhalten [ ] [] Daten mit den Ergebnissen aus der folgenden Methode:

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 

So bin ich kindda hier zu implementieren Abstract fortzufahren stecken und bevölkert und diese Tabelle anzuzeigen ....:/

Bitte um Hilfe!

Antwort

5

Wenn Sie das Einfügen, Löschen oder Daten in Ihrem Modell zu aktualisieren, müssen Sie die GUI von benachrichtigen die Veränderungen. Sie können dies mit der Feuer -Methoden in der AbstractTableModel tun.

I.e. Wenn Sie ein Element zu Ihrer Liste hinzufügen, müssen Sie auch fireTableRowsInserted(int firstRow, int lastRow) aufrufen, damit die sichtbare Ebene aktualisiert werden kann.

Werfen Sie einen Blick auf addElement(MyElement e) in dem folgenden Code:

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

Vielen Dank so so sehr! – Julia

1

Sie müssen kein Objekt [] [] erstellen. Nur Ihre redoviLista eine Liste der Liste:

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

dann implementieren Sie getValueAt wie folgt aus:

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

HI! Danke für Hilfe! Ich habe versucht, es so zu machen, aber es werden keine Ergebnisse angezeigt. Es sollte kein Problem mit meiner Methode sein, denn es gibt die Ergebnisse zurück, ich kann sie ausdrucken. Also habe ich den obigen Code adoptiert, was können Sie bitte überprüfen Sie, ob Sie dies im Sinn hatten? Plus-Methode: public Object getValueAt (int Zeile, int Spalte) { \t \t Rückgabe redoviLista.get (Zeile) .get (Spalte); \t \t} – Julia

2

Es gibt keine Notwendigkeit, ein benutzerdefiniertes Tablemodel für diese zu schaffen. Verwenden Sie einfach das DefaultListModel.

Das DefaultListModel ermöglicht das dynamische Hinzufügen von Zeilen zum Modell mit der Methode addRow (...) und es ruft automatisch die entsprechende fireXXX-Methode auf, um der Tabelle mitzuteilen, dass sie sich neu streichen soll.

würde der Grund Code sein:

DefaultTableModel model = new DefaultTableModel(columnNames); 

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

JTable table = new JTable(model); 

Sie brauchen nicht ein benutzerdefiniertes Tablemodel jedes Mal zu erstellen. Manchmal können Sie mit dem DefaultTableModel beginnen.

Verwandte Themen