2009-10-08 12 views
9

¿Hay alguna manera de ordenar una JTable mediante programación?Clasificación JTable programmatically

Tengo el tipo de mi JTable funcionando (con setRowSorter) para que cuando el usuario presiona cualquiera de las columnas, la tabla se clasifique.

sé, SwingX JXTable probablemente funcionaría, pero yo prefiero no pasar por la molestia porque todo lo demás es más o menos trabajando ahora y no sé qué tan bien maneja editor visual NetBeans' JXTable etc.

EDITAR:La respuesta seleccionada se refiere a mi afirmación (ahora eliminada) de que la respuesta de las páginas de Sun no funcionó para mí. Eso fue solo un problema ambiental causado por mi ignorancia.

+0

¿Puedes publicar algún código que hayas probado? – akf

+0

Revisar: http://www.exampledepot.com/egs/javax.swing.table/Sorter.html –

+0

Pude fácilmente agregar JXTable a NetBeans 6.7, así que no lo descarte como una opción. Tal vez haga un pequeño proyecto de prueba para jugar con él antes de intentar en su proyecto principal. – ssakl

Respuesta

14

funciona bien para mí:

import java.awt.*; 
import java.awt.event.*; 
import java.util.*; 
import javax.swing.*; 
import javax.swing.table.*; 

public class TableBasic extends JFrame 
{ 
    public TableBasic() 
    { 
     String[] columnNames = {"Date", "String", "Long", "Boolean"}; 
     Object[][] data = 
     { 
      {new Date(), "A", new Long(1), Boolean.TRUE }, 
      {new Date(), "B", new Long(2), Boolean.FALSE}, 
      {new Date(), "C", new Long(9), Boolean.TRUE }, 
      {new Date(), "D", new Long(4), Boolean.FALSE} 
     }; 

     final JTable table = new JTable(data, columnNames) 
     { 
      // Returning the Class of each column will allow different 
      // renderers and editors to be used based on Class 

      public Class getColumnClass(int column) 
      { 
       // Lookup first non-null data on column 
       for (int row = 0; row < getRowCount(); row++) 
       { 
        Object o = getValueAt(row, column); 

        if (o != null) 
         return o.getClass(); 
       } 

       return Object.class; 
      } 
     }; 
     table.setPreferredScrollableViewportSize(table.getPreferredSize()); 
     table.setAutoCreateRowSorter(true); 
     // DefaultRowSorter has the sort() method 
     DefaultRowSorter sorter = ((DefaultRowSorter)table.getRowSorter()); 
     ArrayList list = new ArrayList(); 
     list.add(new RowSorter.SortKey(2, SortOrder.ASCENDING)); 
     sorter.setSortKeys(list); 
     sorter.sort(); 

     JScrollPane scrollPane = new JScrollPane(table); 
     getContentPane().add(scrollPane); 
    } 

    public static void main(String[] args) 
    { 
     TableBasic frame = new TableBasic(); 
     frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 

La próxima vez que publica sus SSCCE cuando algo no funciona.

+0

Tiene razón, tenía problemas con mi entorno y no estaba utilizando las últimas clases desde el lado de Java (estoy haciendo la mitad de Clojure/la mitad del proyecto de Java). – auramo

+0

Usa 'Collections.singletonList (new RowSorter.SortKey (2, SortOrder.ASCENDING))' si eres perezoso creando listas. – Matthieu

4

También puede desencadenar fila de clasificación llamando toggleSortOrder() en el RowSorter de su JTable:

table.getRowSorter().toggleSortOrder(columnIndex); 

Tenga en cuenta, sin embargo, que (citando el Javadoc):

invierte el orden de clasificación de la columna especificada Normalmente, esto invertirá el orden de clasificación de ascendente a descendente (o de descendente a ascendente) si la columna especificada ya es la columna ordenada principal.

A pesar de que es más rápido, llamando setSortKeys() como se muestra por @camickr (1 a él) es la forma correcta de ir (pero hay que instanciar un List).