2010-05-30 5 views
6

Я хочу сохранить результаты чтения индекса lucene в jTable, чтобы я мог сортировать его по разным столбцам. Из индекса я читаю термины с разными показателями их частот.create TableModel и заполнять jTable динамически

Столбцы таблицы являются следующие: [термин строка] [ИНТ absFrequency] [ИНТ 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

При вставке, удалении или обновлении данных в вашей модели, вы должны уведомить графический интерфейс перемены. Вы можете сделать это с помощью огня -методов в 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

1

Вам не нужно создавать объект [] []. Просто сделайте ваш redoviLista список списков:

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

тогда вы реализуете getValueAt так:

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

HI! Спасибо за помощь! Я попытался сделать это так, но результаты не отображаются. Это не должно быть проблемой с моим методом, потому что он возвращает результаты, я могу распечатать их. Итак, я принял приведенный выше код к тому, что вы можете проверить, если у вас есть это в виду? Плюс метод: public Object getValueAt (int row, int column) { \t \t return redoviLista.get (row) .get (column); \t \t} – Julia

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.

Смежные вопросы