2010-11-12 10 views
4

J'ai une JTable avec quelques colonnes. J'ai un HashMap de l'identifiant de colonne mis en correspondance avec la position dans la vue, par exemple:Définir l'ordre des colonnes dans JTable

TableHeader1 | TableHeader2 | TableHeader3 
    sth.   sth.   sth. 

Je sais que:

TableHeader1 -> position 0 
TableHeader2 -> position 1 
TableHeader3 -> position 2 

Maintenant, je veux réorganiser les colonnes. Je sais qu'il existe une fonction appelée moveColumn (A, B) dans la classe JTable. Cela déplace une colonne de A à B, et B est mis à gauche ou à droite. Mon problème est, je veux commander toute la table d'une manière spécifique, comment puis-je faire cela? Si j'utilise moveColumn, je ne peux pas savoir où B a été déplacé, dans 5 cas sur 10, il pourrait s'agir du côté droit et dans les autres cas du mauvais côté.

espère que vous comprenez mon problème :-)

Répondre

7

Vous pouvez modifier l'ordre des colonnes en supprimant tous et en les ajoutant dans l'ordre:

public static void setColumnOrder(int[] indices, TableColumnModel columnModel) { 
    TableColumn column[] = new TableColumn[indices.length]; 

    for (int i = 0; i < column.length; i++) { 
     column[i] = columnModel.getColumn(indices[i]); 
    } 

    while (columnModel.getColumnCount() > 0) { 
     columnModel.removeColumn(columnModel.getColumn(0)); 
    } 

    for (int i = 0; i < column.length; i++) { 
     columnModel.addColumn(column[i]); 
    } 
} 
1

OK que diriez-vous. Peut-être un peu à gauche.

Étendez TableColumn et attribuez à votre nouvelle classe une propriété position. Avoir mis en œuvre Comparable et utiliser le position pour comparer les colonnes.

Ensuite, étendez DefaultTableColumnModel et stockez TableColumn s dans une liste ordonnée.

Votre JTable doit maintenant afficher les colonnes en fonction de leur position. Non testé mais cela semble intéressant, donc je pourrais essayer plus tard.

1

Basé sur la réponse @Guillaume, j'ai trouvé un moyen de le faire sans avoir besoin d'enlever toutes les colonnes et de les rajouter.

public static void setColumnOrder(int[] indices, JTable table, TableColumnModel columnModel) { 

    for (int i = 0; i < indices.length; i++) { 
     columnModel.moveColumn(i, table.convertColumnIndexToView(indices[i])); 
    } 
    } 

Cela fonctionne mieux pour moi car avec (SwingX) JXTable, l'ordre des colonnes invisibles n'est pas modifié.

Questions connexes