Problema actualizar JTextArea en "tiempo real"

Carlos
28 de Diciembre del 2004
Mi problema es el siguiente:

Tengo dos clases (LeerFicheroTexto y MiFrame), en la primera lo unico
que hago es mediante un metodo recuperar los datos de un fichero de texto(
mas o menos unas 1500 lineas) y en la segunda tengo un jframe con un jbutton
y un jtextarea. Cuando pulso el boton leo el fichero (linea a linea) y le
paso los
datos al jtextarea, mi duda surge cuando veo que el jtextarea no se
actualiza en "tiempo real" sino que lo hace cuando el metodo de la primera
clase a terminado.

¿Esto se puede hacer no?

Echadme un cable porque ando un poco perdido. Es evidente que algo estoy
haciendo mal, pero lo que no se es que XDDDD.

Aquí os pongo el código de las clases:


LeerFicheroTexto.java

package Ejemplo;
import java.io.*;
import javax.swing.JTextArea;
public class LeerFicheroTexto
{
public LeerFicheroTexto()
{
}
public void leerFichero(JTextArea areaLog)
{
try
{
BufferedReader br=new BufferedReader(new FileReader("c:/log.txt"));
String linea="";
while ((linea=br.readLine())!=null)
{
areaLog.append(linea);
System.out.println(linea);//Lo utilizo para ver si el jtextarea se
actualiza cuando debe ;)
areaLog.append("n");
}
br.close();
}
catch(IOException i)
{
System.out.println(i.toString());
}
}
}


MiFrame.java
package Ejemplo;
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
public class MiFrame extends JFrame implements ActionListener
{
JButton boton1;
JTextArea areaLog;
public MiFrame()
{
super("Mi frame");
setSize(500,400);
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent w)
{
dispose();
System.exit(0);
}
});
boton1=new JButton("Leer fichero");
boton1.addActionListener(this);
getContentPane().add(boton1,BorderLayout.NORTH);
areaLog=new JTextArea("",30,30);
areaLog.setBackground(Color.white);
getContentPane().add(areaLog,BorderLayout.SOUTH);
setVisible(true);
}
public void actionPerformed (ActionEvent a)
{
if (a.getSource()==boton1)
{
areaLog.setText("");
new LeerFicheroTexto().leerFichero(areaLog);
}
}
public static void main(String args[])
{
new MiFrame();
}
}


chuidiang
28 de Diciembre del 2004
A ver si tu problema es este.

Hay un hilo en java encargado de tratar los eventos de ratón y refresco de pantalla.
Cuando pulsas el botón, ese hilo se dedica a leer el fichero y meterlo en el textArea, pero no actualiza el textArea en pantalla, puesto que tu código no lo hace.

Para que se hagan ambas cosas a la vez, en la pulsación del botón debes crear un nuevo hilo que se encargue de leer el fichero, dejando libre el hilo del botón y refresco de pantalla.

Haz algo como esto. Haz que tu clase LeerFichero implemente Runnable. Pon en el metodo run() la llamada a leerFichero().

En el metodo actionPerformed del boton, crea el hilo y ponlo en marcha

public void actionPerformed (...)
{
Thread hilo = new Thread (new LeerFicheroTexto(areaLog));
hilo.start();
}

Como ves, tendrás que pasar en el constructor (o un método que hagas a posta) el areaLog.

Se bueno.