elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Actualizar JTextArea desde otra clase
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Actualizar JTextArea desde otra clase  (Leído 7,368 veces)
ChicoTolerante

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Actualizar JTextArea desde otra clase
« en: 27 Febrero 2013, 02:05 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?

Gracias por todo!!!


En línea

Kenkox

Desconectado Desconectado

Mensajes: 12



Ver Perfil
Re: Actualizar JTextArea desde otra clase
« Respuesta #1 en: 17 Marzo 2013, 23:09 pm »

Pues respondiendo a tu pregunta...
1ª Clase Cliente ( con JTextArea )
2ª Clase Servidor ( con quien quiero modificar el JTextArea )

Lo que podrias hacer es tener tu JTextArea como miembro estatico privado  de tu clase cliente, y con su respectivo metodo get..... en la clase Servidor pues llamas a tu clase cliente, y el metodo get que te regresa el textArea.... el problema de esto es que solo podrias tener un cliente ya que el jtextArea seria miembro de la clase y no de un objeto cliente.... por lo cual te recomiendo que tu crees una clase llamada "Lector"

Clase Servidor ----->

Código
  1. // En esta clase, al momento de crear el hilo de "Lector" tambien le deberas de pasar la referencia de tu jtextarea....
  2. // asi, tu hilo se encargara de escribir el contenido que reciba al jtextarea
  3.  
  4. import java.io.BufferedReader;
  5. import java.io.DataInputStream;
  6. import java.io.DataOutputStream;
  7. import java.io.IOException;
  8. import java.io.InputStreamReader;
  9. import java.io.PrintWriter;
  10. import java.net.ServerSocket;
  11. import java.net.Socket;
  12.  
  13.  
  14. public class Servidor {
  15. public static void main(String[] args) throws IOException {
  16. // variables
  17. String  auxiliar;
  18. int puertoServicio = 0;
  19.        ServerSocket miServicio = null;
  20. Socket miCliente = null;
  21.  
  22.  
  23. // Creando objeto para escribrir flujo de entrada
  24.        BufferedReader  teclado = new BufferedReader(new InputStreamReader(System.in));
  25.  
  26. // pidiendo datos para la conexion
  27. System.out.println("Inserta el numero de puerto");
  28. try{
  29. puertoServicio=Integer.parseInt(teclado.readLine());
  30. System.out.println("Puerto establecido.\nEsperando peticiones");
  31. }
  32. System.out.println("Error de datos del teclado");
  33. System.exit(1);
  34. }
  35.  
  36. // Creando socket, asignando puerto y aceptando solicitud de cliente.
  37.        try {
  38.            miServicio = new ServerSocket(puertoServicio);
  39.    miCliente = miServicio.accept();
  40.        } catch (Exception e) {
  41.            System.err.println("No se establecio el puerto "+puertoServicio);
  42.            System.exit(1);
  43.        }
  44.  
  45. //Creando objeto para leer flujo de entrada desde el socket.
  46. BufferedReader entrada = new BufferedReader(new InputStreamReader(miCliente.getInputStream()));
  47. //DataInputStream entrada = new DataInputStream(miCliente.getInputStream());
  48.  
  49. // Creando objeto para escribir flujo de salida hacia el socket.
  50. //DataOutputStream salida = new DataOutputStream(miCliente.getOutputStream());
  51.        PrintWriter salida = new PrintWriter(miCliente.getOutputStream(), true);
  52.       System.out.println("-----SERVIDOR-----\n\nCliente conectado. Iniciando comunicación...\n");
  53.  
  54.       // Creando un subproceso que se encargará de leer datos  de entrada del socket.(Hilo)
  55.      Thread t = new Thread(new Lector(entrada));
  56.             t.start();
  57.  
  58. // Ciclo interativo de escritura sobre el socket(enviando lineas de texto).
  59.        while (!((auxiliar=teclado.readLine()).equals("salir"))) {
  60.            salida.println(auxiliar);
  61.        }
  62.  
  63. // Cerrando conexiones y flujos.
  64. teclado.close();
  65.        salida.close();
  66.        entrada.close();
  67.        miCliente.close();
  68.        miServicio.close();
  69.    }
  70. }


Clase Lector ---->


Código
  1. // en esta clase, en el contructor tienes que recibir aparte del buffer, recibir un jtextarea...
  2. // y en el metodo run, adjuntar el contenido que el buffer tenga
  3.  
  4. import java.io.BufferedReader;
  5. import java.io.DataInputStream;
  6.  
  7. public final class Lector implements Runnable {
  8.  
  9.    DataInputStream entrada1;
  10.    BufferedReader entrada;
  11.    String cadena;
  12.  
  13.    public Lector(BufferedReader entrada){ /// AQUI TAMBIEN RECIBIR UNA REFERENCIA A UN TEXTAREA
  14.        this.entrada=entrada;
  15.    }
  16.  
  17. @Override
  18.    public void run() {
  19.        try {
  20.  
  21.            while (!((cadena = entrada.readLine()).equals("salir"))) {
  22.                System.out.println("Recibido: " + cadena); // EN LUGAR DE ESTO, SERIA AJDUNTAR CADENA AL JTEXTAREA
  23.            }
  24.  
  25.        } catch (Exception ex) {
  26.            System.out.println("CONEXIÓN FINALIZADA");
  27.   System.exit(0);
  28.        }
  29.    }
  30. }


Clase Cliente  ----->

Código
  1.  
  2. // En esta clase, al crear tu hilo "lector" de igual manera deberas enviar el jtextarea
  3. // de esta clase, para que tu hilo "lector" se encarge de escribir los mensajes que reciba en tu jtextarea
  4. import java.io.BufferedReader;
  5. import java.io.IOException;
  6. import java.io.InputStreamReader;
  7. import java.io.PrintWriter;
  8. import java.net.Socket;
  9.  
  10. public class Cliente {
  11.    public static void main(String[] args) throws IOException {
  12. // declaracion de variables
  13.        Socket miCliente = null;
  14.        String ipServidor;
  15. String auxiliar;
  16.        int puertoServidor = 0;
  17.  
  18. // Creando objeto para  flujo de entrada de datos desde el teclado.
  19.  
  20. // pidiendo datos desde el teclado
  21. System.out.println("Inserta la IP del servidor o nombre del servidor");
  22. ipServidor=teclado.readLine();
  23.  
  24. System.out.println("Insetra numero de puerto");
  25. try{
  26. puertoServidor = Integer.parseInt(teclado.readLine());
  27. }
  28. System.out.println("Error de datos de entrada");
  29. System.exit(1);
  30. }
  31.  
  32. // Inicializando socket
  33. try {
  34.            miCliente = new Socket(ipServidor,puertoServidor);
  35.        } catch (IOException e) {
  36.            System.err.println("No se pudo establecer la conexión");
  37.            System.exit(1);
  38.        }
  39. //Creando objeto para leer flujo de entrada desde el socket.
  40.        BufferedReader entrada = new BufferedReader(new InputStreamReader(miCliente.getInputStream()));
  41. PrintWriter salida = new PrintWriter(miCliente.getOutputStream(), true);
  42.  
  43. System.out.println("-----CLIENTE-----\n");
  44.        System.out.println("Conexión establecida. Comenzando comunicación...\n");
  45.  
  46. // Creando un subproceso que se encargará de leer datos de entrada del socket.
  47.        Thread t=new Thread(new Lector(entrada));
  48. t.start();
  49.  
  50. // Ciclo interactivo de escritura sobre el socket(enviando lineas de texto).
  51. while (!((auxiliar=teclado.readLine()).equals("salir"))) {
  52.             salida.println(auxiliar);
  53.        }
  54.  
  55. // Cerrando todas las conexiones y flujos.
  56. salida.close();
  57. entrada.close();
  58. teclado.close();
  59. miCliente.close();
  60.    }
  61. }
  62.  
  63.  

Como te habras fijado, las anteriores clases son unicamente para un chat en linea de comandos... si lo quieres hacer con java swing... lo que podrias hacer es modificar la clase lector para que reciba una referencia a un textArea en el cual procedentemente Adjuntara el contenido que ha recibido... obviamente tendrias que modificar la clase Servidor y cliente para mandar la referencia de su respectivo JtextArea.... Fijate en los comentarios en mayuscula que estan en la clase lector.... con las 3 clases que te pase es muy sencillo pasarlo a interfaz grafica... tambien tendrias que modificar unas cuantas lineas de Cliente y servidor para saber cuando terminar la comunicacion, en las clases que te pase, se termina cuando alguno de los dos escribe "salir"


Suerte


« Última modificación: 17 Marzo 2013, 23:17 pm por Kenkox » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines