JTextArea añadiendo problemas

Estoy haciendo un progtwig de copia de seguridad, y quiero que todo lo que tenga la copia de seguridad del progtwig se muestre en un JTextArea. bueno, funciona, pero solo después de que el progtwig haya terminado con la copia de seguridad. ¿Cómo puedo solucionar esto? El código que tengo corriendo esto está aquí:

método de respaldo

public void startBackup() throws Exception { // txtarea is the JTextArea Panel.txtArea.append("Starting Backup...\n"); for (int i = 0; i < al.size(); i++) { //al is an ArrayList that holds all of the backup assignments selected // from the JFileChooser File file = new File((String) al.get(i)); File directory = new File(dir); CopyFolder.copyFolder(file, directory); } } 

Copiar clase de carpeta:

 public class CopyFolder { public static void copyFolder(File src, File dest) throws IOException { if (src.isDirectory()) { // if directory not exists, create it if (!dest.exists()) { dest.mkdir(); Panel.txtArea.append("Folder " + src.getName() + " was created\n"); } // list all the directory contents String files[] = src.list(); for (String file : files) { // construct the src and dest file structure File srcFile = new File(src, file); File destFile = new File(dest, file); // recursive copy copyFolder(srcFile, destFile); } } else { try { CopyFile.copyFile(src, dest); } catch (Exception e) { } } } } 

Clase CopyFile

 public class CopyFile { public static void copyFile(File src, File dest) throws Exception { // if file, then copy it // Use bytes stream to support all file types InputStream in = new FileInputStream(src); OutputStream out = new FileOutputStream(dest); byte[] buffer = new byte[1024]; int length; // copy the file content in bytes while ((length = in.read(buffer)) > 0) { out.write(buffer, 0, length); } in.close(); out.close(); // System.out.println("File copied from " + src + " to " + dest); Panel.txtArea.append("File copied " + src.getName() + "\n"); } } 

Gracias por la ayuda con anticipación, y avíseme si hay alguna ayuda que pueda brindar. Hice una búsqueda en Google sobre esto, y parece ser un gran problema, pero no puedo pensar en cómo solucionarlo. Oh, y por favor no menosprecie esto solo porque no se aplica a usted, es muy irritante. Gracias de antemano otra vez!

EDITAR : Esto es lo que obtuve:

 public class test extends SwingWorker { String txt; JTextArea txtArea = null; public test(JTextArea txtArea, String str) { txt = str; this.txtArea = txtArea; } protected Void doInBackground() throws Exception { return null; } protected void process(String str) { txtArea.append(str); } protected void getString() { publish(txt); } } 

El problema principal que tienes es que estás tratando de realizar acciones de locking en el hilo de envío del evento . Esto evitará que la UI se actualice ya que las solicitudes de repintado no llegan al administrador de repintado hasta DESPUÉS de que haya finalizado.

Para superar esto, vas a tener que descargar el trabajo de locking (es decir, el proceso de copia de seguridad) a un hilo separado.

Para esto, le sugiero que tenga una lectura a través de Concurrency in Swing Trail que le proporcionará algunas estrategias útiles para resolver su problema en particular. En particular, probablemente se beneficie de usar un SwingWorker

Eche un vistazo de cerca a doInBackground y los métodos de proceso

ACTUALIZADO con un ejemplo

De acuerdo, este es un ejemplo REALMENTE simple. Básicamente, esto lo lleva a C: \ drive a 3 directorios de profundidad y vuelca el contenido a la JTextArea suministrada

 public class BackgroundWorker extends SwingWorker { private JTextArea textArea; public BackgroundWorker(JTextArea textArea) { this.textArea = textArea; } @Override protected Object doInBackground() throws Exception { list(new File("C:\\"), 0); return null; } @Override protected void process(List chunks) { for (File file : chunks) { textArea.append(file.getPath() + "\n"); } textArea.setCaretPosition(textArea.getText().length() - 1); } protected void list(File path, int level) { if (level < 4) { System.out.println(level + " - Listing " + path); File[] files = path.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { return pathname.isFile(); } }); publish(path); for (File file : files) { System.out.println(file); publish(file); } files = path.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { return pathname.isDirectory() && !pathname.isHidden(); } }); for (File folder : files) { list(folder, level + 1); } } } } 

Simplemente llama a new BackgroundWorker(textField).execute() y aléjate: D

ACTUALIZADO con un ejemplo explícito

 public class BackgroundWorker extends SwingWorker { private JTextArea textArea; private File sourceDir; private File destDir; public BackgroundWorker(JTextArea textArea, File sourceDir, File destDir) { this.textArea = textArea; this.sourceDir = sourceDir; this.destDir = destDirl } @Override protected Object doInBackground() throws Exception { if (sourceDir.isDirectory()) { // if directory not exists, create it if (!destDir.exists()) { destDir.mkdir(); publish("Folder " + sourceDir.getName() + " was created"); } // list all the directory contents String files[] = sourceDir.list(); for (String file : files) { // construct the src and dest file structure File srcFile = new File(sourceDir, file); File destFile = new File(destDir, file); // recursive copy copyFolder(srcFile, destFile); } } else { try { copyFile(sourceDir, destDir); } catch (Exception e) { } } return null; } public void copyFolder(File src, File dest) throws IOException { if (src.isDirectory()) { // if directory not exists, create it if (!dest.exists()) { publish("Folder " + src.getName() + " was created"); } // list all the directory contents String files[] = src.list(); for (String file : files) { // construct the src and dest file structure File srcFile = new File(src, file); File destFile = new File(dest, file); // recursive copy copyFolder(srcFile, destFile); } } else { try { copyFile(src, dest); } catch (Exception e) { } } } public void copyFile(File src, File dest) throws Exception { // if file, then copy it // Use bytes stream to support all file types InputStream in = new FileInputStream(src); OutputStream out = new FileOutputStream(dest); byte[] buffer = new byte[1024]; int length; // copy the file content in bytes while ((length = in.read(buffer)) > 0) { out.write(buffer, 0, length); } in.close(); out.close(); publish("File copied " + src.getName()); } @Override protected void process(List chunks) { for (String msg : chunks) { textArea.append(msg + "\n"); } textArea.setCaretPosition(textArea.getText().length() - 1); } } 

Ahora para correr ...

 new BackgroundWorker(textArea, sourceDir, destDir).execute();