2010-11-11 25 views
5

Estoy trabajando en un proyecto en swings y estoy agregando filas a una JTable en un ciclo while.Swing JTable update

mi escenario es el siguiente: -

Tan pronto como el usuario hace clic en un botón, el programa entra en un bucle while() y empezar a añadir filas a la DefaultTableModel del JTable uno por uno hasta que el bucle while termina. Pero la cuestión es que la tabla se actualiza con los datos solo después de que el ciclo while haya terminado. Quiero que se actualice después de agregar cada fila y mostrarla en la IU.

que sería muy bueno si alguien me podría ayudar con este proporcionar una solución

ya he intentado pintar() después de añadir cada fila, pero no funcionó.

+0

¿cuánto tiempo toma su ciclo while? –

Respuesta

7

Necesita ejecutar su operación en un hilo separado y luego actualizar la JTable en el hilo de la interfaz gráfica de usuario. Algo como esto:

public void someButtonClicked(params...) { 
    new Thread(new Runnable() { 
     public void run() { 
      longOperation(); 
     } 
    }).start(); 
} 

public void longOperation() { 
    for(int i=0; i<1000; i++) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       // add new row to jtable 
      } 
     }); 
    } 
} 
+0

Gracias Gerco que salvó mi día está trabajando ahora – Jinith

+0

gracias por su tiempo y esfuerzo - apreciado – Jinith

0

Si todo el ciclo while se ejecuta en el subproceso de envío del evento Swing en respuesta al evento de clic de botón, el hilo no podrá actualizar la vista en la pantalla hasta que se complete el código de manejo de evento (el final de método actionPerformed).

No estoy seguro de lo que está tratando de lograr aquí, ¿animación quizás? Puede usar la clase de temporizador de Swing (javax.swing.Timer) para disparar un evento repetidamente con un pequeño retraso entre disparos, y en respuesta a cada evento, puede agregar una fila a la tabla. Siempre que su código de manejo de eventos salga rápidamente en respuesta a cada evento disparado, Swing debería poder volver a dibujar la vista entre eventos. Realmente necesitas entender el modelo de enhebrado de Swing bastante bien o estos tipos de problemas son realmente confusos. No es demasiado difícil: hay buenos recursos para leer si busca, p. "Hilo del evento Swing".

Re: calling repaint() - esto no funcionará como repintado() y los otros métodos como validate() etc. solo marcarán un componente como necesario para volver a pintar, el componente no será realmente repintado en la pantalla hasta que Swing tenga la oportunidad de hacerlo, y si atrapas el hilo Swing en un ciclo while, no será libre de pintar hasta que finalices el ciclo y finalice tu código de manejo de eventos.