Ver Mensaje Individual
  #9 (permalink)  
Antiguo 17/11/2008, 23:13
Avatar de HackmanC
HackmanC
 
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 17 años
Puntos: 260
Mensaje Respuesta: ayuda con JTextArea

Hola,

Estás confundido con el concepto de que el JTextArea no pueda recibir datos mientras no se presione un botón o algo parecido. Creí que esto se había aclarado con mi segundo post.

En este ejemplo creo una clase llamada Transmission (como ejemplo no lee de un Socket sino de un archivo de texto : 'data.txt'), esta clase recibe un JTextArea como parámetro en su constructor, e intenta abrir in archivo llamado 'data.txt'. El FileInputStream() lo tienes que reemplazar por el getInputStream() que te devuelve el Socket.
Código:
public Transmission(javax.swing.JTextArea area) {
.....
// El FileStream() es igual al Socket.getInputStream().
// Tienes que cambiar por el stream del socket.
c = new java.io.BufferedInputStream(
        new java.io.FileInputStream(
        new java.io.File("data.txt")));
Cuando se esté ejecutando el thread, no es necesario presionar nada en el teclado, por que mientras siga leyendo caracteres desde el Stream del Socket, va a seguir mostrándolos consecutivamente en el JTextArea.
Código:
while ((b = c.read()) != -1) {
    area.append(String.valueOf((char)b));
    Thread.sleep(500); // Para que vaya despacito, en este ejemplo.
}
La clase Transmission es instanciada y ejecutada desde un thread diferente al thread donde se ejecutó la aplicación, con el objetivo que no se queda 'colgada', mientras está recibiendo datos, como podrás observar si ejecutas la aplicación puedes insertar, borrar y modificar los datos mientras los está leyendo e insertando.
Código:
// Thread donde se lee del socket.
new java.lang.Thread(new Transmission(jTextArea1)).start();
Saludos.

El código de ejemplo completo.
Para probar este programa tienes que crear un archivo que se llame 'data.txt' y colocarlo en el mismo lugar donde estas ejecutando la aplicación, preferiblemente con 20 o más líneas de texto. O adaptarlo a tu programa y cambiar por el InputStream del Socket.
Código:
package JavaApplication1;

import java.io.FileNotFoundException;
import java.io.IOException;

public class JFrame1 extends javax.swing.JFrame {
    
    public JFrame1() {
        initComponents();
        // Thread donde se lee del socket.
        new java.lang.Thread(new Transmission(jTextArea1)).start();
    }
    
    @SuppressWarnings("unchecked")
    private void initComponents() {
        jScrollPane1 = new javax.swing.JScrollPane();
        jTextArea1 = new javax.swing.JTextArea();
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        jTextArea1.setColumns(20);
        jTextArea1.setRows(6);
        jScrollPane1.setViewportView(jTextArea1);
        getContentPane().add(jScrollPane1, java.awt.BorderLayout.CENTER);
        pack();
    }
    
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new JFrame1().setVisible(true);
            }
        });
    }
    
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextArea jTextArea1;
    
    private class Transmission implements java.lang.Runnable {

        java.io.BufferedInputStream c;
        javax.swing.JTextArea area;
        
        public Transmission(javax.swing.JTextArea area) {
            try {
                // El FileStream es igual al Socket.getInputStream.
                // Tienes que cambiar por el stream del socket.
                c = new java.io.BufferedInputStream(
                        new java.io.FileInputStream(
                        new java.io.File("data.txt")));
            } catch (FileNotFoundException ex) {
                System.err.println(ex.getMessage());
            }
            this.area = area;
        }
        
        public void run() {
            try {
                int b;
                // En este caso lee hasta que se terminaron los bytes.
                
                // En los sockets la construcción del while es mientras
                // el socket esté abierto, c.read() bloquea hasta que
                // encuentre un byte. Cuando se cierra el socket tira
                // una IOException (o un Interrupted?).
                
                while ((b = c.read()) != -1) {
                    area.append(String.valueOf((char)b));
                    Thread.sleep(500);
                }
            } catch (InterruptedException ex) {
                System.err.println(ex.getMessage());
            } catch (IOException ex) {
                System.err.println(ex.getMessage());
            }
        }
    }
}
O también busca en Google : Java Tutorial Chat
http://www.ashishmyles.com/tcpchat/index.html

Última edición por HackmanC; 17/11/2008 a las 23:39 Razón: segundo post (el primero usa Enter)