Foro de elhacker.net

Programación => Java => Mensaje iniciado por: ChicoTolerante en 27 Febrero 2013, 02:10 am



Título: Actualizar componentes? Repintar componenteS??
Publicado por: ChicoTolerante en 27 Febrero 2013, 02:10 am
Hola!

Estoy INTENTANDO hacer un chat. El problema lo tengo para actualizar los mensajes enviados y el texto que debe aparecer en el JTextArea. Entonces, tengo lo siguiente, esencialmente:

Código
  1. Fichero 1: clase InterfazDelChat
  2. public class InterfazDelChat extends JFrame implement ActionListener
  3. {
  4. public static JTextArea areaChat = new JTextArea("Titulo del JTextArea del chat\n\n", 50, 50);
  5. public static JButton conec = new JButton("Conectar");
  6. public InterfazDelChat()
  7. {
  8. super("Titulillo");
  9. getContentPane().add(areaChat);
  10. getContentPane().add(conec);
  11. areaChat.addActionListener(this);
  12. }
  13. @Override
  14. public void actionPerformed(ActionEvent ev)
  15. {
  16. new ServidorDelChat;
  17. }
  18. public static void main(String[]args)
  19. {
  20. new InterfazDelChat();
  21. }
  22. }
  23.  

Fichero 2: clase ServidorDelChat
Código
  1. public static class ServidorDelChat
  2. {
  3. public ServidorDelChat()
  4. {
  5. //Codigo del socket hasta el punto de DataInputStream tenerlo en el String mensajeRecibido)
  6. while (desconectado != true)
  7. {
  8. //Lo que yo creia que tenia que poner:
  9. InterfazDelChat.areaChat.append("\nCliente dice:\n" + mensajeRecibido + "\n");
  10. }
  11. /*Lo que ocurre, cuando pongo esto, es que el texto no llega a la interfaz, al JTextArea
  12.  del programa, hasta que no ha completado el bucle
  13. (cuando pongo un numero de opciones finito,
  14. no como el que esta puesto aqui,
  15. si pongo 3, envia 3 mensajes diferentes...),
  16. porque si quiero que esto se pueda repetir, ¿tendre que meterlo en un bucle, no?
  17. El caso es que me lo imprime, y me lo imprime bien, pero tarde.
  18. No me lo imprime en la pantalla, en el caso de poner 3 como fin del bucle,
  19. hasta que no ha superado el bucle, no carga el texto
  20. (no carga el texto de linea en linea, carga solo al final del bucle todos los mensajes acumulados...*/
  21. }
  22. }
  23.  

He imaginado que la clase InterfazDelChat no se vuelve a cargar hasta que acaba con el bucle, que termina el objeto, y así vuelve a cargar los demás objetos. Entonces... mi pregunta sería:
   - ¿Cómo puedo cargar el JTextArea de la clase InterfazDelChat desde la otra clase ServidorSocket? ¿O cómo puedo cargar de nuevo un objeto, o actualizarlo, estando este en una, y queriendo cargarlo desde otra?

He estado buscando y probando diversas cosas, pero nada surgio efecto... Gracias por todo!!


Título: Re: Actualizar componentes? Repintar componenteS??
Publicado por: Chuidiang en 27 Febrero 2013, 08:31 am
Hola:

Tiene pinta de que es problema de que estás manteniendo ocupado el hilo de repintado de ventanas (Event Dispatch Thread  EDT). Cuando pulsas un botón, java ejecuta el actionListener en ese hilo que además es el hilo encargado de pintar las ventanas y su contenido. Si mantienes ese hilo ocupado (un while infinito, leyendo de un socket, etc) NADA se repintará en las ventanas hasta que se termine tu código. Entonces se pintará todo de golpe (lo que dices que lo pinta tres veces, pero tarde).

La solución suele ser en el actionPerformed(), lanzar un hilo que haga todo lo que tengas que hacer, liberando así rápidamente el EDT. Tienes más detalles aquí http://chuwiki.chuidiang.org/index.php?title=El_EDT_%28Event_Dispatch_Thread%29_de_Java

Se bueno.


Título: Re: Actualizar componentes? Repintar componenteS??
Publicado por: ChicoTolerante en 27 Febrero 2013, 10:54 am
Ohhh Chuidiang!! Gran honor para mi!! Tus tutoriales me han sacado de embrollos importantes + de una!!! Es lo que dices seguro, porque si eso es así es normal que no se me esté repintando. Definitivamente, lo acabo de probar y YEAHHHH funciona debidamente! Gracias por la explicación, ahora entiendo qué estaba pasando.

Un saludo cordial, te dejo ahí una vibra en modo "gracias"!!
http://www.youtube.com/watch?v=JkaJP1m_s4Y