1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
| import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Arrays;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;
public class Go {
private final JTable table = new JTable();
public static void main(String[] args) {
new Go();
}
public Go() {
JFrame f = new JFrame();
Object[][] donnees = { { "1z" }, { "1b" },
{ "1a" }, { new Integer(1000) } };
String[] titres = { "titre" };
TableModel modele = new MonModele(donnees, titres);
final FiltreTriModel filtre = new FiltreTriModel(modele);
table.setModel(filtre);
table.getTableHeader().addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
int tableC = table.columnAtPoint(e.getPoint());
int modelCol = table.convertColumnIndexToModel(tableC);
filtre.sort(modelCol);
}
});
f.add(new JScrollPane(table));
f.setLocationRelativeTo(null);
f.pack();
f.setVisible(true);
}
class MonModele extends AbstractTableModel {
Object donnees[][];
String titres[];
public MonModele(Object donnees[][], String titres[]) {
this.donnees = donnees;
this.titres = titres;
}
public int getColumnCount() {
return donnees[0].length;
}
public Object getValueAt(int parm1, int parm2) {
return donnees[parm1][parm2];
}
public int getRowCount() {
return donnees.length;
}
public String getColumnName(int col){
return titres[col];
}
}
class FiltreTriModel extends AbstractTableModel {
TableModel model;
Ligne[] lignes;
int colonneTri;
FiltreTriModel(TableModel m) {
model = m;
lignes = new Ligne[model.getRowCount()];
for (int i = 0; i < lignes.length; ++i)
lignes[i] = new Ligne(i);// voir la classe Ligne plus bas
}
public int getRowCount() {
return model.getRowCount();
}
public int getColumnCount() {
return model.getColumnCount();
}
public Object getValueAt(int rowIndex, int columnIndex) {
return model.getValueAt(lignes[rowIndex].index, columnIndex);
}
public Class<?> getColumnClass(int i) {
return model.getColumnClass(i);
}
public String getColumnName(int i) {
return model.getColumnName(i);
}
// a implémenter si la table est éditable
public boolean isCellEditable(int row, int col) {
return true;
}
// a implémenter si les données peuvent changer
public void setValueAt(Object value, int row, int col) {
model.setValueAt(value, lignes[row].index, col);
fireTableCellUpdated(lignes[row].index, col);
}
public void sort(int c) {
colonneTri = c;
try {
Arrays.sort(lignes);
fireTableDataChanged();
} catch (RuntimeException e) {
} // les données ne sont pas comparables !
}
//------- la classe Ligne -------
private class Ligne implements Comparable {
int index;
public Ligne(int i) {
index = i;
}
public int compareTo(Object o) {
Ligne autreLigne = (Ligne) o;
Object cellule = model.getValueAt(index, colonneTri);
Object autreCellule = model.getValueAt(autreLigne.index,
colonneTri);
if (o instanceof Integer) return 0;
return ((Comparable)cellule).compareTo(autreCellule);
}
}
}
} |