2009-10-08 6 views
9

Existe-t-il un moyen de trier un JTable par programmation?Tri JTable par programme

J'ai le tri de mon JTable (avec setRowSorter) de sorte que lorsque l'utilisateur appuie sur l'une des colonnes, la table est triée.

Je sais, SwingX JXTable fonctionnerait probablement, mais je préfère ne pas passer par les tracas parce que tout le reste est assez bien travaille maintenant et je ne sais pas comment gère éditeur visuel de NetBeans JXTable etc.

EDIT:La réponse sélectionnée fait référence à ma déclaration (maintenant supprimée) que la réponse des pages de Sun n'a pas fonctionné pour moi. C'était juste un problème d'environnement causé par mon ignorance.

+0

pouvez-vous poster du code que vous avez essayé? – akf

+0

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

+0

J'ai été en mesure d'ajouter assez facilement JXTable à NetBeans 6.7, donc ne pas exclure cela comme une option. Peut-être faire un petit projet de test pour jouer avec avant d'essayer dans votre projet principal. – ssakl

Répondre

14

fonctionne bien pour moi:

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 prochaine fois poster votre SSCCE quand quelque chose ne fonctionne pas.

+0

Vous avez raison, j'ai eu des problèmes avec mon environnement et je n'utilisais pas les dernières classes de Java (je fais la moitié du projet Clojure/moitié Java). – auramo

+0

Utilisez 'Collections.singletonList (new RowSorter.SortKey (2, SortOrder.ASCENDING))' si vous êtes paresseux en créant des listes. – Matthieu

4

Vous pouvez également déclencher la ligne de tri en appelant toggleSortOrder() sur le RowSorter de votre JTable:

table.getRowSorter().toggleSortOrder(columnIndex); 

Notez, cependant, que (citant le Javadoc):

Remet l'ordre de tri de la colonne spécifiée. Généralement, cela inverse l'ordre de tri de croissant à décroissant (ou décroissant à croissant) si la colonne spécifiée est déjà la colonne triée principale.

Bien qu'il soit plus rapide, appeler setSortKeys() comme le montre @camickr (+1 lui) est la bonne façon d'aller (mais vous devez instancier un List).