Pregunta

Estoy mostrando muchos datos en JXTable desde el Swingx proyecto. Después de cargar los datos, llamo packAll() En la mesa, pero con 200cientos columnas y 30,000 registros, puede tomar 5 segundos o más. Estoy llamando a esto desde el hilo de swing, lo que significa que la interfaz de usuario está bloqueada durante esos 5 segundos. Intenté llamar packAll En un hilo de fondo y como sospechaba, hacerlo tiene efectos laterales extraños. Después de llamar packAll(), Cuando paseo el mouse sobre la tabla, todos los números en la tabla parecen actualizarse constantemente a diferentes números. ¿Hay alguna forma de obtener una experiencia de usuario razonable en JXTable al empacar las columnas de una tabla tan grande?

¿Fue útil?

Solución

Este bucle en ColumnFactory te está matando:

for (int r = 0; r < getRowCount(table); r++) {
        Component comp = renderer.getTableCellRendererComponent(table, table
                .getValueAt(r, column), false, false, r, column);
        width = Math.max(width, comp.getPreferredSize().width);
}

Probablemente debería establecer los anchos de la columna usted mismo, o tal vez simplemente cargar una fila, empacar la tabla y luego cargar el resto de los datos.

Otros consejos

Jay, no sé qué parte de la respuesta que marcó como correcta quiere decir con "excelente idea", al menos no está clara. Las dos sugerencias fueron:

A) Hágalo usted mismo: deja la pregunta de cuándo y dónde y cómo exactamente b) carga de dos pasos, lo que finalmente se reduce a medir la primera fila cargada solamente. Que se proporciona en ColumnFactory ya, lea el Doc API para GetRowCount (JXTable).

Incluso si su contexto no es tan uniforme como para ser resuelto mediante una simple anulación de getRowCount (), una columna personalizada es el camino a seguir: puede implementar cualquier estrategia de medición que elija :-)

@Z7SG: Nada está "matando" a nada, como habrás notado si hubiera leído el Doc API ;-) La medición de la celda no es del todo trivial, una implementación predeterminada no puede ajustarse a todo, por eso ColumnFactory está diseñado para la extensión: subclase y ajuste a sus necesidades.

Saludos Jeanette

200 columnas y 30,000 filas tomarán un momento para renderizar. No creo que puedas eliminar el tiempo de espera a menos que hagas algo drástico. Su mejor opción podría ser no mostrar la tabla hasta que se carguen los datos.

¿Dices que tienes 200 columnas? Bueno, dudo que los 200 sean visibles a la vez. Entonces, ¿qué pasa si solo empacas la primera columna 10-20? Esto debería reducir el retraso de tiempo en 1/10 o 1/20.

Si JXTable no le permite empacar columnas individuales, entonces puede intentar usar el Ajustador de la cola de tabla que creo que proporciona la misma funcionalidad en una jtable regular. Le permite empacar columnas individuales.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top