2012-04-17 17 views
5

Así que estoy trabajando con un JTable, que está vinculado a un modelo de datos personalizado propio. Eso es todo funcional, pero el problema que tengo es que cada vez que hago un cambio en la tabla (disparando tableDataChanged, tableStructureChanged, etc.) todos los anchos de columna se restablecen a los valores predeterminados. Entiendo por investigar que esto tiene que ver con el TableColumnModel asignado por defecto. Fuera de este restablecimiento, estoy contento con la funcionalidad del DefaultTableColumnModel, pero me gustaría mantener el ancho de las columnas si un usuario debe cambiar su tamaño (arrastrando el borde del encabezado de la columna).¿Cómo puedo mantener los anchos de columna especificados por el usuario en una tabla JTable?

Conozco setPreferredWidth() para TableColumns, y he podido hacerlo con éxito; Supongo que mi pregunta es qué tipo de evento debería escuchar para guardar y establecer este ancho preferido. Traté de agregar un PropertyChangeListener al encabezado de la tabla, pero obtendría un StackOverflow cada vez que intenté cambiar el tamaño (supongo que se estaba ejecutando de forma recursiva). Estoy perfectamente de acuerdo con agregar un miembro de datos adicional en el modelo de datos para los anchos de columna, y almacenarlo allí, pero simplemente no sé cuándo/cómo establecer estos anchos para que no sean anulados por el fireTableStructureChanged(), eventos etc. ¿Pensamientos?

+1

Antes de cerrar el proceso, lea los anchos de columna y guárdelos en un archivo de propiedades. Cuando abra su proceso, lea el archivo de propiedades y, si existe, configure los anchos de columna. Es posible que necesite extender el DefaultTableColumnModel para que pueda controlar el ancho de las columnas. –

+0

Realmente hace esto en cualquier llamada a fireTableStructureChanged(), no solo al comienzo del programa, por lo que si agrego o elimino columnas en el modelo de datos (donde tiene que regenerar columnas) lo hace. He intentado reemplazar 'fireTableStructureChanged()' para establecer manualmente el ancho de las columnas, pero aparentemente no tiene ningún efecto. Supongo que no estoy seguro exactamente dónde está ocurriendo esta generación de columnas y dónde anularla. – kcoppock

+0

Siempre he hecho anchos de columna basados ​​en datos. Si encuentro algo, daré una respuesta. –

Respuesta

1

Pruebe algo como esto.

import javax.swing.JTable; 
import javax.swing.table.TableColumn; 
import javax.swing.table.TableColumnModel; 

public class ColumnResizer { 

    public static void setColumnPreferredWidth(JTable table, int column, 
      int preferredWidth) { 
     TableColumnModel columnModel = table.getColumnModel(); 
     TableColumn tableColumn = columnModel.getColumn(column); 
     tableColumn.setPreferredWidth(preferredWidth); 
    } 

} 
+0

Me gusta la idea, y funciona, pero solo hasta el próximo evento de cambio de estructura. Sin embargo, me puso en el camino correcto y ahora me doy cuenta de que todo ocurre en el método 'addColumn()' de 'TableColumnModel'. Localicé la fuente aquí: http://fuseyism.com/classpath/doc/javax/swing/table/DefaultTableColumnModel-source.html y estoy reemplazando para agregar un 'column.setPreferredWidth()' allí también. Adjuntaré una referencia a mi modelo de datos para que pueda obtener y establecer los anchos de columna según sea necesario, y simplemente manejarlo allí. ¡Gracias! – kcoppock

1

¿Qué hay de

table.setAutoCreateColumnsFromModel(false);

tuve este problema también, esto funcionó para mí!

Cuestiones relacionadas