2010-05-30 17 views
6

Quiero almacenar los resultados de la lectura del índice de lucene en jTable, para que pueda hacerlo ordenable por columnas diferentes. Del índice estoy leyendo términos con diferentes medidas de sus frecuencias.crear TableModel y rellenar jTable dinámicamente

columnas de la tabla son los siguientes: [término cadena] [int absFrequency] [int docFrequency] [doble invFrequency]

Así que en AbstractTableModel que puede definir nombres de columna, pero no sé cómo conseguir el objeto [ ] [] datos con los resultados de los siguientes métodos:

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 

así que estoy atascado Kindda aquí para proceder a aplicar AbstractTableModel y poblar y mostrar esta tabla ....:/

Por favor, ayuda!

Respuesta

5

Cuando se va a insertar, eliminar o actualizar datos en el modelo, es necesario notificar a la interfaz gráfica de usuario de los cambios. Puede hacer esto con el fire -methods en el AbstractTableModel.

I.e. si agrega un elemento a su lista, también debe llamar al fireTableRowsInserted(int firstRow, int lastRow) para que la capa visible se pueda actualizar.

Tenga una mirada en addElement(MyElement e) en el código de abajo:

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

¡Muchísimas gracias! – Julia

1

No tiene que crear un Objeto [] []. Simplemente haga su redoviLista una lista de listas:

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

continuación, se implementa getValueAt así:

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

HI! ¡Gracias por la ayuda! Traté de hacerlo así, pero no se muestran resultados. No debería ser un problema con mi método, porque devuelve los resultados, puedo imprimirlos. Así que he adoptado el código anterior para lo que augures, ¿pueden verificar si tenían esto en mente? método Plus: public Object getValueAt (int fila, int columna) { \t \t retorno redoviLista.get (fila) .get (columna); \t \t} – Julia

2

No hay necesidad de crear un TableModel personalizado para esto. Simplemente use DefaultListModel.

DefaultListModel le permite agregar dinámicamente filas al modelo utilizando el método addRow (...) e invoca automáticamente el método apropiado de fireXXX para indicarle a la mesa que vuelva a pintar.

El código básico sería:

DefaultTableModel model = new DefaultTableModel(columnNames); 

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

JTable table = new JTable(model); 

No es necesario para crear un TableModel cada encargo. A veces puede comenzar con el DefaultTableModel.

Cuestiones relacionadas