Problema actualizar JTextArea en "tiempo real"
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();
}
}
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();
}
}
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.
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.