2009-10-08 21 views
9

C'è un modo per ordinare una JTable a livello di programmazione?Ordinamento di JTable a livello di programmazione

Ho il mio ordinamento JTable (con setRowSorter) in modo che quando l'utente preme una delle colonne, la tabella viene ordinata.

so, SWingX JXTable probabilmente funzionerebbe, ma preferisco non passare attraverso il fastidio perché tutto il resto è praticamente lavorando ora e non so quanto bene editor visuale di NetBeans' gestisce JXTable ecc

MODIFICA:La risposta selezionata si riferisce alla mia (ora rimossa) affermazione che la risposta delle pagine di Sun non ha funzionato per me. Quello era solo un problema ambientale causato dalla mia ignoranza.

+0

puoi pubblicare del codice che hai provato? – akf

+0

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

+0

Sono stato in grado di aggiungere facilmente JXTable a NetBeans 6.7, quindi non escluderlo come opzione. Forse fare un piccolo progetto di prova con cui giocare prima di provare nel tuo progetto principale. – ssakl

risposta

14

funziona bene per me:

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); 
    } 
} 

prossima volta inviare un vostro SSCCE quando qualcosa non funziona.

+0

Hai ragione, ho avuto problemi con il mio ambiente e non usavo le ultime classi da Java-side (sto facendo metà Clojure/metà progetto-Java). – auramo

+0

Utilizzare 'Collections.singletonList (new RowSorter.SortKey (2, SortOrder.ASCENDING))' se si è pigri a creare elenchi. – Matthieu

4

È inoltre possibile attivare fila ordinamento chiamando toggleSortOrder() sulla RowSorter del vostro JTable:

table.getRowSorter().toggleSortOrder(columnIndex); 

Si noti, tuttavia, che (citando il Javadoc):

inverte l'ordine del colonna specificata. Normalmente questo inverte l'ordinamento da ascendente a discendente (o decrescente ad ascendente) se la colonna specificata è già la colonna ordinata primaria.

Anche se è più veloce, chiamando setSortKeys() come mostrato da @camickr (+1 a lui) è il modo corretto di andare (ma è necessario un instanciate List).

Problemi correlati