2009-09-29 13 views

risposta

-4

Impostare il min, max e "normale" di larghezza a 0:

jTable.getColumn("ABC").setWidth(0); 
jTable.getColumn("ABC").setMinWidth(0); 
jTable.getColumn("ABC").setMaxWidth(0); 

Il secondo approccio è quello di estendere TableColumnModel e sovrascrivere tutti i metodi per creare l'illusione (per il JTable) che il modello doesn' Ho queste due colonne.

Quindi, quando si nasconde una colonna, è necessario restituirne una in meno quando la tabella richiede il numero di colonne e quando richiede la colonna X, potrebbe essere necessario aggiungere +1 all'indice della colonna (a seconda che sia è a sinistra oa destra della colonna nascosta), ecc.

Consentire al nuovo modello di tabella di inoltrare tutte le chiamate di metodo (con gli indici corretti, ecc.) al modello di colonna effettivo e utilizzare il nuovo modello di tabella in JTable.

+0

No, non funziona. –

+0

È inoltre necessario impostare la larghezza minima e massima. –

+0

Perché l'ordine è importante, l'ho provato prima e non ho usato lo stesso ordine in modo che non funzioni, oe ho usato lo stesso ordine (larghezza, min, max) funziona, quindi PERCHE '? –

-2

è possibile creare una sottoclasse del modello, e sovrascrivere TableModel.getColumnCount come segue:

int getColumnCount() { 
    return super.getColumnCount()-2; 
} 

Le ultime due colonne non sarebbero poi essere visualizzati nella JTable.

+0

ma posso ottenere i dati da loro? –

+0

stai solo creando l'illusione che le colonne non siano lì, ma ci sono ancora e dovresti quindi essere in grado di ottenere i dati ancora – dharga

+0

Ma come dovrei nasconderli dalla GUI. –

54

Rimuovere TableColumn dallo TableColumnModel.

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

Se è necessario l'accesso ai dati, allora si utilizza table.getModel().getValueAt(...).

Per una soluzione più complessa che consente all'utente di nascondere/mostrare colonne come si desidera controllare lo Table Column Manager.

+2

questo è il modo giusto per farlo: impostare la larghezza su 0 è una specie di falso. In questo modo hai ancora i dati nel tuo modello; stai solo nascondendo parte della vista. – M1EK

+4

Anche con l'approccio di cui sopra i dati sono ancora nel modello ed è per questo che è possibile accedervi come dimostrato sopra. Ecco come funziona MVC. Tutto quello che stiamo facendo è cambiare la vista. Quando imposti la larghezza su 0, prova a fare tabulazioni, quando colpisci la colonna nascosta il fuoco sparisce fino a quando non tocchi nuovamente la scheda. Questo confonderà gli utenti. – camickr

+0

grazie mille.questo mi ha aiutato molto ......... – Geetanjali

12

Ho provato 2 possibili soluzioni che funzionano entrambe, ma ho riscontrato qualche problema con la prima soluzione.

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

o

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

Nella mia recente caso, ho preferito la seconda soluzione perché ho aggiunto un TableRowSorter.

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

Quando si utilizza table.removeColumn(table.getColumnModel().getColumn(4)), sarà rimuovere fisicamente la colonna dalla vista/tavolo quindi non è possibile utilizzare table.getValueAt(row, 4) - restituisce ArrayIndexOutOfBounds. L'unico modo per ottenere il valore della colonna rimossa è chiamando table.getModel().getValueAt(table.getSelectedRow(),4). Dal momento che TableRowSorter sorta solo ciò che è sul tavolo, ma non i dati del oggetto DefaultTableModel, il problema è quando si ottiene il valore dopo ordinare i record - sarà recuperare i dati da DefaultModelObject, che non è ordinato .

così ho usato la seconda soluzione poi utilizzato table.getValueAt(table.getSelectedRow(),4);

L'unico problema che vedo con il 2 ° approccio è stato menzionato da @camickr: "Quando si imposta la larghezza a 0, provare tabulazione, quando si preme il nascosto la messa a fuoco della colonna scompare fino alla tabulazione di nuovo, in modo da confondere gli utenti. "

+6

Usa 'table.getModel(). getValueAt (table.convertRowIndexToModel (row), 4). – xmedeko

-3

Li ho provati tutti: non aiutano. Il modo migliore è quello di creare un nuovo modello di tabella senza la colonna che si desidera eliminare. Ecco come si fa:

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); 
28

Prima rimuovere la colonna dalla vista

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

quindi recuperare i dati dal modello.

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

Una cosa da notare è che quando il recupero dei dati, deve essere recuperare da modella non dal tavolo.

+0

Come rimuovere dal modello? – partho

6

Ho avuto lo stesso problema e causa di sto usando TableColumnModelremovColumn(); does'not aiutarmi così ho usato questo

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

e ha funzionato bene per me nascondere una colonna 0 e ho ancora in grado di ottenere il valore da questo