Pregunta

Estoy buscando una manera de mostrar un indicador de progreso animado (GIF animado, una rueda giratoria renderizada a través de Java2D, etc., no hay preferencia aquí) en una celda de la tabla hasta que se haya calculado o recuperado el valor que finalmente se mostrará.

Hasta ahora solo he puesto un texto estático "pendiente..." en cada celda que aún no está lista para acelerar la visualización.A medida que llegan datos de un hilo en segundo plano, los coloco en la celda correspondiente y llamo a repintar en la mesa.

Con una etiqueta o imagen estática esto funciona bien, pero debido a que la representación de la celda usa esto solo como una especie de sello de goma y no crea instancias separadas por celda (lo cual por supuesto es una buena idea en cuanto al rendimiento), un GIF animado, por ejemplo, sí lo hace. no "jugar" en las celdas individuales.

¿Cómo puedo lograr tal efecto?Sería una interfaz de usuario más "pulida" que un simple texto.

¿Fue útil?

Solución

Como usted dice, el mecanismo básico de representación JTable no soporta esta, CellRenderer se utiliza para pintar una célula (o parte de una célula según sea necesario), y no permitirá que se vuelve a dibujar, se basa en la demanda.

Método 1 - JLayeredPane

Si lo que necesitaba hacer esto sería utilizar un JLayeredPane para dibujar mis prestadores de animación en la parte superior de la JTable.

Sin embargo, creo que sería mucho trabajo. Que había necesidad de conseguir un buen montón derecha, sobre todo si lo tenías dentro de un panel de desplazamiento. Usted jerarquía de contención sería algo como:

JScrollPane -> (Visor) JLayeredPane -> JTable y JPanel (transparente, con animaciones)

También tendría un trabajo complicado por la que nuestra su panel de animaciones, que te sea necesario un administrador de diseño personalizado para reflejar ancho de las columnas JTable, o usar algo como un GridLayout. Factible, pero una gran cantidad de trabajo.

Método 2 - CellRenderer personalizada y volver a pintar en el oscilación del temporizador

La única alternativa, sería la de mantener una lista de las células que fueron animadas, y luego mantener un temporizador swing que llama pintar sobre ellos en varias ocasiones. A continuación, tendría un CellRenderer personalizada que pinte la animación, con la pintura que cambia con el tiempo. Esto podría ser más simple, pero conseguir la velocidad de fotogramas a la derecha de la CPU sin comer, y obtener actualizaciones de repintados para que coincida con las actualizaciones de animación podría dar lugar a algunos efectos visuales impares

Otros consejos

Primero seguí la misma idea que tenía Nick Fortescue (Método 2).Sin embargo, justo después de eso me topé con

El blog de la madriguera del conejo

donde el autor proporciona clases muy útiles para íconos animados (basados ​​en GIF), así como un indicador de progreso infinito dibujado en Java2D (la famosa rueda giratoria de Mac OS X) que podría colocar en mi aplicación sin tener que preocuparme por pintar demasiado. mí mismo.

Sin embargo, si no los hubiera encontrado, el camino de Nick habría sido el mismo.

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