2012-08-28 27 views
5

Estoy usando un procesador de células personalizado que implementa TableCellRenderer y muestra JTextArea (en lugar de JLabel) para cada fila. Básicamente estoy anulando el método getTableCellRendererComponent (...) con el mío, que hace algunos cálculos adicionales por fila. Estos cálculos deben hacerse solo una vez por actualización de la tabla. Como se llama al método getTableCellRendererComponent con cada movimiento del mouse, se produce un retraso. Así que pensé que debería evitar que se llamara getTableCellRendererComponent para evitar el retraso.Reducir el número de llamadas a getTableCellRendererComponent

Consideraciones:

1) Mi tabla tiene sólo el 1 columna y no tiene cabecera.

2) Mis datos son estáticos y se leen de un método ArrayList por getValueAt (int row, int column) en una clase de modelo de tabla personalizada que implementa AbstractTableModel.

3) No necesito vigilar los eventos de movimiento del mouse.

4) No espero mucha información, por lo que podría mostrar toda la tabla a la vez o guardarla en caché por completo.

5) La mayor parte del retraso se debe a la configuración de texto cada vez que regresas de getTableCellRendererComponent, porque algunas filas usan caracteres de derecha a izquierda y el texto RTL requiere más tiempo para renderizar.

+1

solo para enfatizar la respuesta de @Robin: nunca haga ningún cálculo en getXXRendererComponent. La frecuencia de las llamadas es alta y está completamente fuera de su control. – kleopatra

+0

@kleopatra k lo consiguió. ¿Pero cómo controlo las operaciones internas entonces? Como los métodos setText y setFont que uso (para mi celda JTextArea) dentro del método getCellRendererComponent. –

+0

configurar el _renderer_ está bien ... Parece que no estoy entendiendo lo que realmente quiere decir con "cálculo". Tiempo para un SSCEE (o al menos el código del procesador de renders :-) – kleopatra

Respuesta

7

No intente limitar el número de llamadas getTableCellRendererComponent. En cambio, mejore la implementación del renderizador guardando en caché los resultados del cálculo.

Puede agregar fácilmente un detector al modelo de tabla para que su procesador sepa cuándo se actualiza el modelo. Solo entonces debe marcar que los resultados del cálculo almacenado no son válidos y volver a calcularlos en la siguiente llamada getTableCellRendererComponent.

Cuestiones relacionadas