He diseñado una GUI en la que he usado una JTable desde la que tengo que hacer 2 columnas invisibles. ¿Cómo debo hacer eso?Cómo hacer una columnas en JTable Invisible para Swing Java
Respuesta
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.
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
.
, pero ¿puedo obtener los datos de ellos? –
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
Pero, ¿cómo debería ocultarlos de la GUI? –
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.
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
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
muchas gracias. Esto me ayudó mucho ......... – Geetanjali
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 ".
Use 'table.getModel(). getValueAt (table.convertRowIndexToModel (fila), 4). – xmedeko
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);
, 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.
¿Cómo eliminar del modelo? – partho
tuve el mismo problema y debido a que estoy usando TableColumnModel
removColumn();
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
- 1. Java Swing: Jtable ArrayIndexOutOfBoundsException
- 2. Java JTable - Hacer solo una columna editable
- 3. Java Swing: ¿encabezados de columna múltiples en una JTable?
- 4. Cómo agregar el botón en una fila de JTable en Swing java
- 5. Swing JTable update
- 6. Java: ¿cómo hacer doble buffer en Swing?
- 7. ¿Cómo hacer que el fondo de una JTable sea transparente?
- 8. ¿Puedo hacer una columna JTable sin bordes?
- 9. ¿Cómo hacer un jtable no editable en java?
- 10. Java - Swing - JTable - Establecer color para la fila seleccionada, pero no la celda
- 11. JAVA - Validación en JTable
- 12. ¿Cómo eliminar todas las columnas de JTable?
- 13. Cómo hacer un JFrame Modal en Swing java
- 14. ordenación de columnas múltiples en JTable
- 15. ¿Cómo crear una apariencia personalizada para Java Swing?
- 16. ¿Cómo hacer invisible la "pista" de UISlider?
- 17. Hacer un enlace completamente invisible?
- 18. ¿Puedes hacer "un borde invisible"?
- 19. Una mejor manera de hacer aplicaciones Swing
- 20. ¿Cómo aprender Java Swing y hacer GUIs rápidamente?
- 21. Java Swing - ¿Cómo hacer un sonido antes de cualquier JOptionPane?
- 22. Ajuste de tamaño mínimo para una ventana en Java Swing
- 23. Java Pulsaciones de Swing: cómo hacer el trabajo CTRL-modificador
- 24. Pruebas unitarias para impresión en Java Swing
- 25. Java JTable change cell color
- 26. ¿Cómo hacer una fila JTable a un estado "no seleccionado" después de seleccionar cualquier fila en esa tabla?
- 27. ¿Cómo hacer un lienzo con Swing?
- 28. Ventana emergente en Java Swing
- 29. ¿Cómo puedo hacer que mis columnas tengan diferentes tamaños usando GridLayout en swing?
- 30. ¿Cómo puedo hacer que una ventana sea invisible para los eventos del mouse en WPF?
No, no funciona. –
También debe establecer el ancho mínimo y máximo. –
¿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É? –