Foros del Web » Programación para mayores de 30 ;) » Java »

ayuda con JTextArea

Estas en el tema de ayuda con JTextArea en el foro de Java en Foros del Web. buenas, quisiera saber como puedo visualizar datos constantemente utilizando la clase "javax.swing.JTextArea" osea un area de texto, lo que quiero hacer es lo siguiente: una ...
  #1 (permalink)  
Antiguo 15/11/2008, 21:36
Avatar de cocu3  
Fecha de Ingreso: diciembre-2007
Mensajes: 235
Antigüedad: 16 años, 11 meses
Puntos: 6
ayuda con JTextArea

buenas, quisiera saber como puedo visualizar datos constantemente utilizando la clase "javax.swing.JTextArea" osea un area de texto, lo que quiero hacer es lo siguiente:

una clase sera la que tenga esta caja para visualizar el texto, se que con el metodo insert se puede hacer esto:

javax.swing.JTextArea caja;
caja.insert("\n texto a ingresar",0);

y la otra clase sera la que me entregara constantemente los String a meter a la primera

pero no se como hacer esto, o sea necesito ayuda con la primera clse porque ni idea, la seegunda ya la tengo de un pelo
  #2 (permalink)  
Antiguo 15/11/2008, 23:56
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 9 meses
Puntos: 260
Sonrisa Respuesta: ayuda con JTextArea

Hola,

No sé si entendí bien tu pregunta, posiblemente ..

Tienes dos JTextArea, y quieres copiar los datos del primero al segundo en algún momento, al presionar un botón o al accionar alguna tecla, como podría ser cada vez que se presiona 'enter'.

Ya que los tienes creados (los dos JTextArea), tienes que crear un 'java.awt.event.KeyListener' y agregarselo al segundo JTextArea, para que reciba los eventos del teclado, y el método keyReleased() podría copiar los datos al primer JTextArea, como por ejemplo:

Código:
TextArea2.addKeyListener(new java.awt.event.KeyListener() ....
...
public void keyReleased(java.awt.event.KeyEvent e) {
	if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) {
		TextArea1.append(TextArea2.getText());
		TextArea2.setText("");
	}
}
Cuando la tecla recibida sea ENTER, agregar (append - al final), el texto del JTextArea2 a JTextArea1, y eliminar lo que hay en TextArea2.

Saludos,
  #3 (permalink)  
Antiguo 16/11/2008, 20:19
Avatar de cocu3  
Fecha de Ingreso: diciembre-2007
Mensajes: 235
Antigüedad: 16 años, 11 meses
Puntos: 6
Respuesta: ayuda con JTextArea

no, lo que pasa es que en un jTextArea quiero ir almacenado los datos que le entrega otra clase, esta segunda clase va a estar entregando constantemente datos porque va a estar leyendo los datos que le llegan por un socket TCP

osea, lo que quiero hacer es ir visualizando las tramas TCP que llegan al computador ir visualizandolas constantemente en el jTextArea, pero no he podido ya que para poder visualizar un dato en el jTextArea toca activar un boton o teclear alguna letra en el teclado, pero solo lee un dato por cada vez que orpimo un boton....

nose si esto se pueda hacer, o como puedo asociar un evento a la segunda clase para que esta automaticamente entregue los datos y se visualicen constantemente


saluds
  #4 (permalink)  
Antiguo 16/11/2008, 23:56
 
Fecha de Ingreso: noviembre-2008
Mensajes: 3
Antigüedad: 16 años
Puntos: 0
Respuesta: ayuda con JTextArea

Todavia no entiendo cual es tu problema, la verdad me parece q no te explicas muy bien, a mi parecer, como vas a tener una clase q trabaje por un lado y visualize cosas en un JTextArea de otra clase??, el frame o lo q sea q estes usando de interfaz grafica es quein se debe preovupar por pedir los datos a mostrar, las clases q ejecutan operaciones no tienen porq preovuparse de mostrar, nose si me este explicando bien...debes hacer una clase q maneje todo, la cual se pueda acceder desde la interfaz grafica, indepenientemente de las operaciones q estes haciendo la interfaz podra mostrar los datos como ella quiera, pero no hagas la empanada de q otra clase tenga acceso al JTextArea, porq la nterfaz grafica es quien le interesa el JTextArea
  #5 (permalink)  
Antiguo 17/11/2008, 11:56
Avatar de cocu3  
Fecha de Ingreso: diciembre-2007
Mensajes: 235
Antigüedad: 16 años, 11 meses
Puntos: 6
Respuesta: ayuda con JTextArea

ok men, de acuerdo, la clase principal es la del jframe, osea la que deifne el jTextArea.

quisiera saber entonces como el jTextArea puede pedirle los datos a la otra clase, ya instanciada y todo eso, para que vaya visualizando los datos en el area de texto

exite algun metodo del jTextArea que haga esto?? o sea que utilice la otra clase para leer datos constantemente?? sin neceisdad de colocar algun boton o cosa similar para leer los datos y visualizarlos

saluds

Última edición por cocu3; 17/11/2008 a las 12:12
  #6 (permalink)  
Antiguo 17/11/2008, 17:15
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 9 meses
Puntos: 260
Mensaje Respuesta: ayuda con JTextArea

Hola,

Creo que posiblemente, lo puedas realizar de la siguiente forma, yo aún tengo muchas dudas de tu implementación, pero posiblemente te sea de alguna ayuda,

El Socket recibe datos en un input stream, yo personalmente prefiero un buffered stream y que tenga el método readLine(), eso me permite bloquear el Socket hasta que reciba una línea completa de texto, (de esa forma no se necesita estar haciendo pull's al buffer, y como lo vas a desplegar en un JTextArea me imagino que estas recibiendo datos de texto y no binarios).

Pero esa llamada a readLine() bloquea el thread donde fue llamado el método readLine() y por lo tanto el programa no puede hacer otra cosa mientras está esperando.

En tu caso necesitas que el Socket sea creado en otro thread, o por lo menos en un SwingWorker, y el readLine() debe estar dentro de un ciclo while mientras lo necesites, cada vez que el readLine() reciba una línea de texto, se la agregas al JTextArea con el método append(), posiblemente necesites una llamada a repaint().

JTextArea funciona en base a un Document, podrías crear un Document personalizado que lea directamente del Socket; pero, creo que es complicar más las cosas, si no es una aplicación que maneja más de 2 o 3 tipos diferentes de Document,

Espero haber sido de alguna ayuda,
Saludos.

Última edición por HackmanC; 17/11/2008 a las 17:21 Razón: repaint
  #7 (permalink)  
Antiguo 17/11/2008, 17:34
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 9 meses
Puntos: 260
Sonrisa Respuesta: ayuda con JTextArea

Hola,

Creo que lo que quieres es recibir datos binarios, por lo que no puedes hacer un readLine(), y no te funciona el ENTER. Y entonces no queda otra más que hacer un bucle que haga el pull del stream a cada poco con el método .available().

Mientras el socket este abierto ... {
Si hay datos (.available()) entonces lealos (read()) y paselos al JTextArea.
}

O...

Mientras el socket este abierto ... {
Si lee un dato (.read()) entonces paselo al JTextArea.
}
O algo así!

El método read() bloquea el thread, así que tienes que hacerlo en un SwingWorker.
De otra forma no tengo ni idea que es lo que quieres hacer,
Igualmente, espero haber sido de alguna ayuda.
Saludos.

ps:
El anterior post lo deje sin modificar como referencia.
  #8 (permalink)  
Antiguo 17/11/2008, 21:26
Avatar de cocu3  
Fecha de Ingreso: diciembre-2007
Mensajes: 235
Antigüedad: 16 años, 11 meses
Puntos: 6
Respuesta: ayuda con JTextArea

hola, gracias por tu repuesta me ha servido de mucho

creo que no me hice entender muy bien, pero es algo parecido lo que quiero hacer,
la clase principal es la del jframe y esta lo unico que tiene que hacer leer los datos con ayuda de la otra clase e ir visualizandolos en el jtextarea, pero segun tengo entendido los elementos del jframe (sean botones, field, menus, etc) funcionan es con eventos, es decir, realizan alguna tarea solo cuando ocurre un evento (un evento como oprimir una tecla, o cliquear con el mouse), entonces nose como el jtextarea puede ir visualizando constantemente los datos que le llegan por el socket TCP, ya que nose como relacionarlo con un evento

lo que quiero hacer es algo similar a un chat, es decir, estar pendiente si al socket TCP le llego algun dato o texto o lo que sea y despues visualizar ese texto en el jtextarea, sabiendo que los datos que le van a llegar pueden llegar en cualquir momento, asi que lo ideal seria relacionar esos datos con algun evento, porque sino tocaria detener toda la aplicacion mientras se queda escuchando el puerto hasta que llegue algo, creo que es una comparacion buena con lo que estoy tratando de explicar

bueno creo q ya he dado mucha lora con esto, si alguien me pueda sacar de la duda se lo agradesco

saluds
  #9 (permalink)  
Antiguo 17/11/2008, 23:13
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 9 meses
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)
  #10 (permalink)  
Antiguo 17/11/2008, 23:27
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 9 meses
Puntos: 260
Mensaje Respuesta: ayuda con JTextArea

Hola,

Si deseas crearlo con eventos todo se complica bastante.

Tienes que crear una clase que extienda java.net.Socket, que emita eventos por medio de Listeners, y el javax.swing.JTextArea debería ser un consumidor de eventos, implementando una clase abstracta o una interface específica del Listener que deseas emitir y recibir. Busca información acerca de Listeners y MVC (modelo, vista, controlador).

Espero haber sido de alguna ayuda,
en caso contrario, tal ves alguien más
pueda ser más claro.

Saludos .
  #11 (permalink)  
Antiguo 17/11/2008, 23:48
Avatar de cocu3  
Fecha de Ingreso: diciembre-2007
Mensajes: 235
Antigüedad: 16 años, 11 meses
Puntos: 6
Respuesta: ayuda con JTextArea

amigo, me has ayudado bastante, me sacaste de una duda enorme, gracias

gracias a tu codigo aprendi dos cosas, que se puede crear una clase dentro de otra, eso nunca lo habia echo, la verdad estoy empezando en esto de java, y la segunda que se puede crear un hilo dentro de un jframe

ahora esta corriendo muy bien mi aplicacion, cualquier cosa la estare comentando

saluds
  #12 (permalink)  
Antiguo 21/11/2009, 16:47
 
Fecha de Ingreso: noviembre-2009
Mensajes: 7
Antigüedad: 15 años
Puntos: 0
Respuesta: ayuda con JTextArea

Buenas!!!

Compas estoy haciendo dos proyecto de la u.. lo estoy realizando en el netbeans.. en los 2 tengo un problema en comun.

1.El primer proyecto es un video de alquiler de peliculas.. los usuarios pueden buscar las peliculas(q estan guardadas en un txt) ya sea por genero, actor principal o nombre de la pelicula.. quiero q al digitar alguna de las opciones me despliegue en un jtextarea los datos de la pelicula con la opcion digitada.. o sea si puso "batman" en nombre de la peli me despliegue todos los datos de esa peli(nombre,genero,duracion,actor principal...etc) al igual q en actor principal, en el caso de genero q nada mas me despliegue todos los nombres de las peliculas con ese genero.

2. el siguiente poyecto es de complasencias musicales, q si el usuario digita por ejemplo "eres", en el jtextfield me despliegue todos los datos de esa cancion q igual las tengo en un txt.


agradeceria mucho la ayuda brindada..

[email protected]

San Jose,Costa Rica.
  #13 (permalink)  
Antiguo 21/11/2009, 16:48
 
Fecha de Ingreso: noviembre-2009
Mensajes: 7
Antigüedad: 15 años
Puntos: 0
Respuesta: ayuda con JTextArea

los datos de las pelis y las canciones yo las digito igual en otra opcion en el programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:55.