Comment rendre une colonne dans JTable Invisible pour Swing Java

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

32
demandé sur IAdapter 2009-09-29 16:23:09

7 réponses

Supprimer TableColumnTableColumnModel.

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.

58
répondu camickr 2016-03-14 16:43:50

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.

31
répondu zawhtut 2014-10-04 12:52:14

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."

14
répondu Mr. Xymon 2012-05-03 06:40:57

j'ai eu le même problème et à cause de j'utilise TableColumnModelremovColumn(); 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

6
répondu Anti Atlas Dev 2016-01-26 23:03:38

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.

-3
répondu Maurice Perry 2011-11-22 18:18:47

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);
-3
répondu Rijul Gupta 2012-10-05 12:16:10

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.

-4
répondu Aaron Digulla 2009-09-29 13:04:07