2010-05-30 106 views
6

我想將讀取lucene索引的結果存儲到jTable中,以便我可以按不同的列對它進行排序。從索引中,我正在閱讀使用不同頻率度量的術語。創建TableModel並動態填充jTable

表列有這些: [字符串項] [INT absFrequency] [INT docFrequency] [雙invFrequency]

所以我AbstractTableModel上我可以定義的列名,但我不知道如何讓對象[ ] []數據與下面的方法結果:

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 

所以我kindda堅持在這裏着手實施AbstractTableModel上和填充,並顯示該表....:/

請幫幫忙!

回答

5

當你插入,刪除或模型中的更新數據,您需要通知的GUI變化。您可以使用火災 - AbstractTableModel中的方法執行此操作。

I.e.如果將元素添加到列表中,則還必須致電fireTableRowsInserted(int firstRow, int lastRow),以便可更新可見圖層。

有在下面的代碼看看addElement(MyElement e)

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

非常感謝! – Julia 2010-05-30 11:38:20

1

你不必創建一個Object [] []。只是讓你redoviLista列表的列表:

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

那麼你實現getValueAt這樣的:

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

嗨!感謝幫助!我試圖這樣做,但沒有顯示結果。它不應該是我的方法的問題,因爲它返回的結果,我可以打印出來。 所以我採用了上面的代碼來擴大你的能力,請檢查一下你是否有這個想法? Plus方法: public Object getValueAt(int row,int column){ \t \t return redoviLista.get(row).get(column); \t \t} – Julia 2010-05-30 10:38:45

2

沒有必要創建一個自定義的TableModel這一點。只需使用DefaultListModel。

DefaultListModel允許您使用addRow(...)方法動態地將行添加到模型中,並且它會自動調用相應的fireXXX方法來告訴表重新繪製自己。

的基本代碼將是:

DefaultTableModel model = new DefaultTableModel(columnNames); 

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

JTable table = new JTable(model); 

你並不需要創建一個自定義的TableModel每次。有時你可以從DefaultTableModel開始。