/ / Comment puis-je obtenir un TableModel post-sort mis à jour? - java, balançoire, tri, jtable

Comment obtenir un TableModel post-sort mis à jour? - java, balançoire, tri, jtable

J'ai un JTable utilisant setAutoCreateRowSorter(true) et RowSorterListener attaché, voir ci-dessous, car je dois effectuer certaines opérations ailleurs dans mon application sur une sorte de JTable.

Je trouve que chaque fois que je clique sur un en-tête de colonne poursort, la table JTable réaffiche les lignes dans le bon ordre et l’auditeur est appelé, mais le modèle Table que j’extrais est toujours le modèle de table de tri préalable prédéfini.

table.getRowSorter().addRowSorterListener(new RowSorterListener() {
@Override
public void sorterChanged(RowSorterEvent rsevent) {
rsevent.getSource().getModel(); // Nope, original ordering here
table.getModel(); // Same thing
}
};

Comment puis-je obtenir le nouvel ordre de post-tri des lignes, tel qu'il est maintenant affiché dans JTable?

Réponses:

4 pour la réponse № 1

Les données dans le TableModel ne changent jamais, seule la vue des données change.

Si vous voulez que les données du modèle dans l'ordre, elles sont affichées dans la table, utilisez simplement:

table.getValueAt(row, column);

En d'autres termes, vous devez parcourir toutes les lignes et toutes les colonnes pour obtenir les données dans l'ordre actuellement affiché.


1 pour la réponse № 2

Je pense que vous pouvez utiliser table.convertRowIndexToModel (int ...), mais je pense qu’il existe une meilleure solution disponible.

Si vous définissez votre propre convertRowIndexToModel () comme "une recherche rapide (peut-être via une carte, O (1)), cette solution devrait suffire. Si c'est" O (n), alors c'est ce qu'il faut corriger.

Parcourez simplement une boucle de lignes, convertissez chacune d’elles et effectuez la recherche à l’aide de l’index obtenu.

Voici les 2 méthodes de TableSorter qui devraient vous intéresser:

 private Row[] getViewToModel() {

if (viewToModel == null) {
int tableModelRowCount = tableModel.getRowCount();

viewToModel = new Row[tableModelRowCount];

for (int row = 0; row < tableModelRowCount; row++) {
viewToModel[row] = new Row(row);
}

if (isSorting()) {
Arrays.sort(viewToModel);
}
}

return viewToModel;
}

et:

private int[] getModelToView() {

if (modelToView == null) {
int n = getViewToModel().length;

modelToView = new int[n];

for (int i = 0; i < n; i++) {
modelToView[modelIndex(i)] = i;
}
}

return modelToView;
}

0 pour la réponse № 3

Bonjour, je sais que la réponse est très tardive, mais j’ai essayé le code utilisé dans le commentaire de @LazyCubicleMonkey et cela a fonctionné ici, c’est mon code pour obtenir la ligne lorsque jTable est trié.

DefaultTableModel search_model = (DefaultTableModel) jTable.getModel();
search_model.removeRow(jTable.convertRowIndexToModel(row));
jTable.setModel = (search_model)