web-dev-qa-db-fra.com

Comment rendre une colonne dans JTable invisible pour Swing Java

J'ai conçu une interface graphique dans laquelle j'ai utilisé une JTable à partir de laquelle je dois rendre 2 colonnes invisibles. Comment dois-je faire ça?

35
om.

Supprimez le TableColumn du TableColumnModel.

TableColumnModel tcm = table.getColumnModel();
tcm.removeColumn( tcm.getColumn(...) );

Si vous avez besoin d'accéder aux données, vous utilisez table.getModel().getValueAt(...).

Pour une solution plus complexe qui permet à l'utilisateur de masquer/afficher les colonnes comme il le souhaite, consultez le Table Column Manager .

62
camickr

Retirez d'abord la colonne de la vue

 table.removeColumn(table.getColumnModel().getColumn(4));

Récupérez ensuite les données du modèle.

table.getModel().getValueAt(table.getSelectedRow(),4);

Une chose à noter est que lors de la récupération des données, elles doivent être extraites du modèle et non de la table.

34
zawhtut

J'ai essayé 2 solutions possibles qui fonctionnent toutes les deux, mais j'ai eu un problème avec la 1ère solution.

   table.removeColumn(table.getColumnModel().getColumn(4));

ou

   table.getColumnModel().getColumn(4).setMinWidth(0);
   table.getColumnModel().getColumn(4).setMaxWidth(0);
   table.getColumnModel().getColumn(4).setWidth(0);

Dans mon cas récent, j'ai préféré la 2ème solution car j'ai ajouté un TableRowSorter.

   TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
   table.setRowSorter(sorter);

Lorsque vous utilisez table.removeColumn(table.getColumnModel().getColumn(4)), il supprime physiquement la colonne de la vue/table, vous ne pouvez donc pas utiliser table.getValueAt(row, 4) - il renvoie ArrayIndexOutOfBounds. La seule façon d'obtenir la valeur de la colonne supprimée est d'appeler table.getModel().getValueAt(table.getSelectedRow(),4). Puisque TableRowSorter trie uniquement ce qui est sur la table mais pas les données dans l'objet DefaultTableModel, le problème est lorsque vous obtenez la valeur après triant les enregistrements - il récupérera les données de DefaultModelObject, qui n'est pas trié.

J'ai donc utilisé la 2ème solution puis utilisé table.getValueAt(table.getSelectedRow(),4);

Le seul problème que je vois avec la 2ème approche a été mentionné par @camickr: "Lorsque vous définissez la largeur sur 0, essayez de tabuler, lorsque vous appuyez sur le focus de la colonne masquée disparaît jusqu'à ce que vous tabuliez à nouveau. Cette va dérouter les utilisateurs. "

15
Mr. Xymon

j'ai eu le même problème et parce que j'utilise TableColumnModelremovColumn(); ne m'aide pas alors j'ai utilisé ceci

table.getColumnModel().getColumn(0).setWidth(0);
table.getColumnModel().getColumn(0).setMinWidth(0);
table.getColumnModel().getColumn(0).setMaxWidth(0); 

et a bien fonctionné pour moi, il cache une colonne 0 et je peux toujours en tirer de la valeur

6
Anti Atlas Dev

Si vous supprimez la colonne du JTable, la colonne est toujours présente dans le TableModel.

Par exemple, pour supprimer la première colonne ID:

TableColumnModel tcm = table.getColumnModel();
tcm.removeColumn(tcm.getColumn(0));

Si vous souhaitez accéder à la valeur de la colonne supprimée, vous devez y accéder via la fonction getValueAt de TableModel, pas la JTable. Mais vous devez reconvertir en rowIndex en rowIndex dans le modèle.

Par exemple, si vous souhaitez accéder à la première colonne de la ligne sélectionnée:

int modelRow = table.convertRowIndexToModel(table.getSelectedRow());
int value = (Integer)table.getModel().getValueAt(modelRow,0);
0
Foltin