2011-08-04 4 views
2

Je voudrais trier JTable lignes en fonction d'une colonne cachée.JTable Tri basé sur la colonne cachée

que j'ai un JTable comme celui-ci

column1 column2 
val1  val2 

Maintenant, j'ai un plus colonne3 qui est caché et je ne veux pas montrer. Lorsque l'utilisateur clique sur la colonne 2, il doit trier les lignes en fonction de la colonne 3 (colonne masquée) et non de la colonne 2.

Comment réaliser ceci dans JTable?

+1

dans une quête pour confondre vos utilisateurs ;-) – kleopatra

Répondre

2

vous pouvez ajouter par défaut TableRowSorter-JTable mais il y a RowSorter, rien de mieux et sont bien définies comme Multisort Table Header Cell Renderer

définitions des notes de Darryl pour RowSorter est valable que pour TableColumn béton

exemple siple (avec usage moins balast à nouveau)

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

public class HeaderDoubleclickTest { 

    private String[] columnNames = {"String", "Integer", "Boolean"}; 
    private Object[][] data = { 
     {"aaa", 12, true}, {"bbb", 5, false}, 
     {"CCC", 92, true}, {"DDD", 0, false} 
    }; 
    private TableModel model = new DefaultTableModel(data, columnNames) { 

     private static final long serialVersionUID = 1L; 

     @Override 
     public Class<?> getColumnClass(int column) { 
      return getValueAt(0, column).getClass(); 
     } 
    }; 
    private JTable table = new JTable(model); 
    private JTableHeader header; 

    static class TestTableRowSorter extends TableRowSorter<TableModel> { 

     TestTableRowSorter(TableModel m) { 
      super(m); 
     } 

     @Override 
     public void toggleSortOrder(int column) { 
     } 

     public void wrapToggleSortOrder(int column) { 
      super.toggleSortOrder(column); 
     } 
    } 
    private Timer timer = new Timer(400, new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      System.out.println("single"); 
      JTable table = header.getTable(); 
      RowSorter sorter; 
      if (pt != null && table != null && (sorter = table.getRowSorter()) != null) { 
       int columnIndex = header.columnAtPoint(pt); 
       if (columnIndex != -1) { 
        columnIndex = table.convertColumnIndexToModel(columnIndex); 
        ((TestTableRowSorter) sorter).wrapToggleSortOrder(columnIndex); 
       } 
      } 
     } 
    }); 
    private Point pt; 

    public JComponent makeUI() { 
     timer.setRepeats(false); 
     table.setRowSorter(new TestTableRowSorter(model)); 
     header = table.getTableHeader(); 
     header.addMouseListener(new MouseAdapter() { 

      @Override 
      public void mouseClicked(final MouseEvent e) { 
       if (timer.isRunning() && !e.isConsumed() && e.getClickCount() > 1) { 
        System.out.println("double"); 
        pt = null; 
        timer.stop(); 
       } else { 
        pt = e.getPoint(); 
        timer.restart(); 
       } 
      } 
     }); 
     JPanel p = new JPanel(new BorderLayout()); 
     p.add(new JScrollPane(table)); 
     return p; 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 

    public static void createAndShowGUI() { 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     f.getContentPane().add(new HeaderDoubleclickTest().makeUI()); 
     f.setSize(320, 240); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 
} 
+0

Ai-je besoin de transmettre l'index de la colonne hiddlen à wrapToggleSortOrder (colonne int)? Va-t-il trier en fonction de la colonne cachée? – u449355

+0

@Umesh: Ceci est un bon exemple d'interception de clics d'en-tête et de distinction entre clics simples et doubles, si vous avez également besoin de cette fonctionnalité; mais il n'aborde pas directement l'ordre de tri. Voir aussi ceci [approche complémentaire] (http://stackoverflow.com/questions/6937694/jtable-sorting-based-on-hidden-column/6939889#6939889). +1 pour [Icônes alpha] (http://tips4java.wordpress.com/2010/08/22/alpha-icons/). – trashgod

3

Utilisez le code affiché ici: http://www.esus.com/docs/GetQuestionPage.jsp?uid=1270

il y a l'argument variable/méthode col - il suffit de vérifier si le vôtre ses COLUMN2 et si oui traiter comme il était votre colonne cachée - la trier et la table rerender.

+0

+1 Ceci pourrait être utile pour supporter les anciennes versions; voir aussi cette [réponse] (http://stackoverflow.com/questions/5798411/heads-up-on-implementing-rowsorter-and-rowfilter-java-1-4/5798542#5798542). – trashgod

2

Une approche consiste à implémenter l'interface Comparable pour le type Column2, comme s Montré dans ce example, et de comparer en utilisant la valeur correspondante Column3. Commodément, si Column3 implémente déjà Comparable<Column3>, vous pouvez simplement déléguer à Column3, comme le fait example avec Double.