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?
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 .
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.
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. "
j'ai eu le même problème et parce que j'utilise TableColumnModel
removColumn();
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
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);