Comment rendre une colonne dans JTable Invisible pour Swing Java
7 réponses
Supprimer TableColumn
TableColumnModel
.
TableColumnModel tcm = table.getColumnModel();
tcm.removeColumn( tcm.getColumn(...) );
Si vous avez besoin d'accéder aux données que vous utilisez table.getModel().getValueAt(...)
.
Pour une solution complexe qui permet à l'utilisateur d'afficher/masquer les colonnes comme ils le souhaitent découvrez Colonne De Table Manager.
tout d'Abord supprimer la colonne de la vue.
table.removeColumn(table.getColumnModel().getColumn(4));
puis extraire 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, il doit être récupéré à partir du modèle pas de la table.
j'ai essayé 2 solutions possibles qui fonctionnent toutes les deux, mais j'ai eu quelques problèmes 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 récent cas, j'ai préféré la 2e solution parce que j'ai ajouté un TableRowSorter.
TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
table.setRowSorter(sorter);
en utilisant table.removeColumn(table.getColumnModel().getColumn(4))
, il va enlever la colonne de la vue/table de sorte que vous ne pouvez pas utiliser table.getValueAt(row, 4)
retourne ArrayIndexOutOfBounds
. La seule façon d'obtenir la valeur de la colonne supprimée est d'appeler table.getModel().getValueAt(table.getSelectedRow(),4)
. Depuis TableRowSorter trie uniquement ce qui est sur la table, mais pas les données dans le Defaulttabltable Model objet, le problème, c'est quand vous obtenez la valeur après tri des enregistrements - il va extraire les données de DefaultModelObject, qui n'est pas triée.
alors j'ai utilisé la 2ème solution puis j'ai 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 à 0, essayez la tabulation, quand vous frappez la colonne masquée accent disparaît jusqu'à ce que vous onglet nouveau. Cela va dérouter les utilisateurs."
j'ai eu le même problème et à cause de j'utilise TableColumnModel
removColumn();
ne'not m'aider j'ai donc utilisé ce
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 cacher une colonne 0 et j'ai encore en mesure d'obtenir la valeur de
Vous pouvez créer une sous-classe du modèle, et de remplacer TableModel.getColumnCount
comme suit:
int getColumnCount() {
return super.getColumnCount()-2;
}
les deux dernières colonnes ne seraient alors pas affichées dans le JTable
.
j'ai tout essayé: ils n'aident pas. La meilleure façon est de faire un nouveau modèle de table sans la colonne que vous voulez supprimer. C'est comment vous le faites:
table = (DefaultTableModel) <table name>.getModel();
DefaultTableModel table1 = new DefaultTableModel();
Vector v = table.getDataVector();
Vector v1 = newvector(v,<column index you want to delete>);
Vector newvector(Vector v,int j){
Vector v1= new Vector();
try{
Vector v2;
Object[] o = v.toArray();
int i =0;
while(i<o.length){
v2 = (Vector) o[i];
v2.remove(j);
v1.add(v2);
i++;
}
}
catch(Exception e){
JOptionPane.showMessageDialog(null,"Error in newvector \n"+e);
}
return v1;
}
Vector getColumnIdentifiers(int i) {
Vector columnIdentifiers = new Vector();
int j=0;
while(j<i){
columnIdentifiers.add(("c"+(j+1)));
j++;
}
return columnIdentifiers;
}
table1.setDataVector(v1,getColumnIdentifiers((<column count>-1)));
<table name>.setModel(table1);
Réglez la largeur min, max et "normale" à 0:
jTable.getColumn("ABC").setWidth(0);
jTable.getColumn("ABC").setMinWidth(0);
jTable.getColumn("ABC").setMaxWidth(0);
La seconde approche consiste à étendre TableColumnModel
et outrepasser toutes les méthodes pour créer l'illusion (pour le JTable) que votre modèle n'a pas ces deux colonnes.
Donc quand vous masquer une colonne, vous devez retourner un de moins, quand la table demande le nombre de colonnes et quand il demande la colonne X, vous pouvez avoir à ajouter +1 à l'index de colonne (selon qu'elle est à gauche ou à droite de l'cachés colonne), etc.
laissez votre nouveau modèle de table transférer tous les appels de méthode (avec les index corrigés, etc) vers le modèle de colonne réel et utilisez le nouveau modèle de table dans le JTable.