2009-09-29 102 views

Respuesta

-4

Ajuste el min, max y "normal" anchura a 0:

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

El segundo enfoque es extender TableColumnModel y reemplazar todos los métodos para crear la ilusión (para el JTable) que su modelo doesn' t tienen esas dos columnas.

Así que cuando oculta una columna, debe devolver una menos cuando la tabla solicita el número de columnas y cuando solicita la columna X, puede que tenga que agregar +1 al índice de la columna (dependiendo de si está a la izquierda oa la derecha de la columna oculta), etc.

Deje que su nuevo modelo de tabla reenvíe todas las llamadas de método (con los índices corregidos, etc.) al modelo de columna real y utilice el nuevo modelo de tabla en JTable.

+0

No, no funciona. –

+0

También debe establecer el ancho mínimo y máximo. –

+0

¿Por qué es importante el pedido? Lo intenté primero y no usé el mismo orden, por lo que no funciona, o si usé el mismo orden (ancho, mínimo, máximo) que funciona, entonces, ¿POR QUÉ? –

-2

Se puede crear una subclase del modelo, y anular TableModel.getColumnCount de la siguiente manera:

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

Las últimas dos columnas serían entonces no se mostrarán en la JTable.

+0

, pero ¿puedo obtener los datos de ellos? –

+0

solo está creando la ilusión de que las columnas no están allí, pero aún están allí y deberían poder obtener los datos todavía – dharga

+0

Pero, ¿cómo debería ocultarlos de la GUI? –

54

Quite TableColumn del TableColumnModel.

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

Si necesita acceder a los datos a continuación, utiliza table.getModel().getValueAt(...).

Para una solución más compleja que le permita al usuario ocultar/mostrar columnas como lo desee, consulte el Table Column Manager.

+2

esta es la manera correcta de hacer esto - establecer el ancho en 0 es un poco falso. De esta manera, todavía tienes los datos en tu modelo; solo estás ocultando parte de la vista. – M1EK

+4

Incluso con el enfoque anterior, los datos aún se encuentran en el modelo y es por eso que puede acceder a ellos como se demostró anteriormente. Así es como funciona MVC. Todo lo que estamos haciendo es cambiar la vista. Cuando establece el ancho en 0, intente tabular, cuando golpee la columna oculta, el foco desaparece hasta que vuelva a tabular. Esto confundirá a los usuarios. – camickr

+0

muchas gracias. Esto me ayudó mucho ......... – Geetanjali

12

Intenté 2 posibles soluciones que funcionen, 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, he preferido la segunda solución, ya he añadido un TableRowSorter.

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

Al utilizar table.removeColumn(table.getColumnModel().getColumn(4)), eliminará físicamente la columna de la vista/mesa de modo que no se puede utilizar table.getValueAt(row, 4) - vuelve ArrayIndexOutOfBounds. La única forma de obtener el valor de la columna eliminada es llamando al table.getModel().getValueAt(table.getSelectedRow(),4). Desde TableRowSorter tipo sólo lo que está sobre la mesa, pero no los datos de la objeto DefaultTableModel, el problema es cuando se obtiene el valor después ordenar los registros - que recuperará los datos de DefaultModelObject, que no está ordenada .

por lo que utiliza la segunda solución, entonces utiliza table.getValueAt(table.getSelectedRow(),4);

El único problema que veo con el segundo enfoque fue mencionado por @camickr: "Al establecer el ancho a 0, trate de tabulación, cuando se pulse el Oculto el foco de la columna desaparece hasta que vuelva a tabular. Esto confundirá a los usuarios ".

+6

Use 'table.getModel(). getValueAt (table.convertRowIndexToModel (fila), 4). – xmedeko

-3

He intentado todas: no ayudan. La mejor manera es crear un nuevo modelo de tabla sin la columna que desea eliminar. Así es como se hace:

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

, saca primero la columna de la vista

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

A continuación, recuperar los datos del modelo.

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

Una cosa a tener en cuenta es que cuando se recuperan los datos, debe ser recuperar de modelo no de la mesa.

+0

¿Cómo eliminar del modelo? – partho

6

tuve el mismo problema y debido a que estoy usando TableColumnModelremovColumn(); does'not ayudarme así que utiliza este

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

y funcionó bien para mí ocultar una columna 0 y todavía capaz de obtener el valor de él

Cuestiones relacionadas