eliminar - Cómo hacer una columna en JTable Invisible para Swing Java
como eliminar una columna de un jtable en java (7)
He diseñado una GUI en la que he usado una JTable desde la cual tengo que hacer 2 columnas invisibles. ¿Cómo debo hacer eso?
Establezca el ancho mínimo, máximo y "normal" en 0:
jTable.getColumn("ABC").setWidth(0);
jTable.getColumn("ABC").setMinWidth(0);
jTable.getColumn("ABC").setMaxWidth(0);
El segundo enfoque es extender TableColumnModel
y anular todos los métodos para crear la ilusión (para JTable) de que su modelo no tiene esas dos columnas.
Entonces, cuando oculta una columna, debe devolver una menos cuando la tabla solicite el número de columnas y cuando solicite la columna X, puede que tenga que agregar +1 al índice de la columna (dependiendo de si está a la izquierda) o el derecho de la columna oculta), etc.
Deje que su nuevo modelo de tabla reenvíe todas las llamadas a métodos (con los índices corregidos, etc.) al modelo de columna real y utilice el nuevo modelo de tabla en JTable.
Intenté 2 posibles soluciones que funcionan, pero tengo algún problema con la primera solución.
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);
En mi caso reciente, preferí la segunda solución porque agregué un TableRowSorter .
TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
table.setRowSorter(sorter);
Al usar table.removeColumn(table.getColumnModel().getColumn(4))
, eliminará físicamente la columna de la vista / tabla para que no pueda usar table.getValueAt(row, 4)
- devuelve ArrayIndexOutOfBounds
. La única forma de obtener el valor de la columna eliminada es llamando a table.getModel().getValueAt(table.getSelectedRow(),4)
. Como TableRowSorter ordena solo lo que hay en la tabla pero no los datos en el objeto DefaultTableModel , el problema es cuando obtiene el valor después de ordenar los registros: recuperará los datos de DefaultModelObject , que no está ordenado.
Entonces utilicé la segunda solución y luego utilicé table.getValueAt(table.getSelectedRow(),4);
El único problema que veo con el segundo enfoque fue mencionado por @camickr: "Cuando estableces el ancho en 0, prueba con tabulación, cuando tocas el foco de la columna oculta desaparece hasta que vuelvas a tabular. Esto confundirá a los usuarios".
Los he probado todos: no ayudan. La mejor manera es crear un nuevo modelo de tabla sin la columna que desea eliminar. Así es como lo haces:
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);
Primero quite la columna de la vista
table.removeColumn(table.getColumnModel().getColumn(4));
Luego recupera los datos del modelo.
table.getModel().getValueAt(table.getSelectedRow(),4);
Una cosa a tener en cuenta es que, al recuperar los datos, debe recuperarse del modelo y no de la tabla.
Puede crear una subclase del modelo y anular TableModel.getColumnCount
siguiente manera:
int getColumnCount() {
return super.getColumnCount()-2;
}
Las dos últimas columnas no se mostrarán en JTable
.
tuve el mismo problema y debido a que estoy usando TableColumnModel
removColumn();
no me ayuda, así que usé esto
table.getColumnModel().getColumn(0).setWidth(0);
table.getColumnModel().getColumn(0).setMinWidth(0);
table.getColumnModel().getColumn(0).setMaxWidth(0);
y funcionó bien para mí, oculta una columna 0 y todavía puedo obtener valor de ella
Elimine TableColumn
de TableColumnModel
.
TableColumnModel tcm = table.getColumnModel();
tcm.removeColumn( tcm.getColumn(...) );
Si necesita acceder a los datos, utilice table.getModel().getValueAt(...)
.
Para una solución más compleja que le permita al usuario ocultar / mostrar columnas como lo desee, consulte el Administrador de columnas de tabla .