Je cherchais le tri dans JTable
et j'ai référé de nombreux articles, mais je n'ai pas pu trouver le moyen le plus simple de trier le tableau. Je sais également que TableRowSorter
pourrait être utile d'une manière ou d'une autre, mais je ne sais pas comment. Étant nouveau dans JTable
, je crée une nouvelle question ici.
Ma structure de table est quelque chose comme ça
| People | Place | Organisation | Event | Mentions |
_____________________________________________________________
| Ramanuj | India | Tata Consultancy | Party'14 | 500000 |
| Prankster | USA | Microsoft Pvt Ltd | Party'14 | 900000 |
Ce que je veux ici, c'est trier mon tableau par ordre décroissant en fonction de la 4ème colonne ("Mentions"). Si le nombre (Mentions) est le même, il doit trier par ordre croissant dans la 1ère colonne ("Personnes")
CSVReader reader = new CSVReader(new FileReader(file));
List<String[]> myEntries = reader.readAll();
String[][] rowData = myEntries.toArray(new String[0][]);
String[] columnNames = { "People", "Place", "Organisation", "Event", "Mentions" };
DefaultTableModel tableModel = new DefaultTableModel(rowData, columnNames);
Selon Comment utiliser les tableaux: tri et filtrage
JTable table = new JTable(tableModel);
TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(table.getModel());
table.setRowSorter(sorter);
List<RowSorter.SortKey> sortKeys = new ArrayList<>(25);
sortKeys.add(new RowSorter.SortKey(4, SortOrder.ASCENDING));
sortKeys.add(new RowSorter.SortKey(0, SortOrder.ASCENDING));
sorter.setSortKeys(sortKeys);
Mise à jour
Êtes-vous sûr qu'il triera?
...Oui
import Java.awt.EventQueue;
import Java.util.ArrayList;
import Java.util.List;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.RowSorter;
import javax.swing.SortOrder;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
DefaultTableModel model = new DefaultTableModel(new String[]{"People", "Place", "Organisation", "Event", "Mentions"}, 0);
model.addRow(new Object[]{"Prankster", "USA", "Microsoft Pvt Ltd", "Party'14", 900000});
model.addRow(new Object[]{"Ramanuj", "India", "Tata Consultancy", "Party'14", 500000});
model.addRow(new Object[]{"Banana", "India", "Tata Consultancy", "Party'14", 500000});
JTable table = new JTable(model);
TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(table.getModel());
table.setRowSorter(sorter);
List<RowSorter.SortKey> sortKeys = new ArrayList<>(25);
sortKeys.add(new RowSorter.SortKey(4, SortOrder.ASCENDING));
sortKeys.add(new RowSorter.SortKey(0, SortOrder.ASCENDING));
sorter.setSortKeys(sortKeys);
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new JScrollPane(table));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}
Mise à jour
Vous pouvez extraire les données de la vue directement ...
for (int row = 0; row < table.getRowCount(); row++) {
String people = table.getValueAt(row, 0).toString();
String place = table.getValueAt(row, 1).toString();
String organisation = table.getValueAt(row, 2).toString();
String event = table.getValueAt(row, 3).toString();
int mentions = (int)table.getValueAt(row, 4);
//...
}
Cela vous donnera les données dans l'ordre de "visualisation" (ou triées) ...