Ho progettato una GUI in cui ho usato un JTable da cui devo rendere invisibili 2 colonne. Come dovrei farlo?Come creare una colonna in JTable Invisible per Swing Java
risposta
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.
è 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
.
ma posso ottenere i dati da loro? –
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
Ma come dovrei nasconderli dalla GUI. –
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.
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
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
grazie mille.questo mi ha aiutato molto ......... – Geetanjali
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. "
Usa 'table.getModel(). getValueAt (table.convertRowIndexToModel (row), 4). – xmedeko
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);
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.
Come rimuovere dal modello? – partho
Ho avuto lo stesso problema e causa di sto usando TableColumnModel
removColumn();
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
No, non funziona. –
È inoltre necessario impostare la larghezza minima e massima. –
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 '? –