Проблемы с добавлением JTextArea

Я создаю резервную программу, и мне нужно все, что у меня есть, резервная копия программы отображается на JTextArea. ну, это работает, но только после завершения программы с резервной копией. Как это исправить? Код, который у меня запущен, находится здесь:

метод резервного копирования

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); } } 

Копировать class папки:

 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) { } } } } 

Класс 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"); } } 

Спасибо за помощь заранее, и дайте мне знать о любой помощи, которую я могу дать. Я сделал поиск по Google, и это, кажется, большая проблема, но я просто не могу подумать, как ее исправить. О, и, пожалуйста, не делайте это прямо, потому что это не относится к вам, это очень усугубляет ситуацию. Спасибо заранее!

EDIT : Это то, что я получил:

 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); } } 

Основная проблема, с которой вы сталкиваетесь, заключается в том, что вы пытаетесь выполнить блокирующие действия в Диспетчере событий . Это предотвратит обновление пользовательского интерфейса, поскольку запросы перерисовки не дойдут до диспетчера repaint до тех пор, пока вы не закончите.

Чтобы это произошло, вам нужно будет отключить работу блокировки (т. Е. Процесс резервного копирования) в отдельный stream.

Для этого я предлагаю вам прочитать Concurrency в Swing Trail, который предоставит вам некоторые полезные страtagsи для решения вашей конкретной проблемы. В частности, вы, вероятно, получите выгоду от использования SwingWorker

Внимательно посмотрите на doInBackground и методы процесса

ОБНОВЛЕНО ПРИМЕРОМ

Хорошо, так что это ДЕЙСТВИТЕЛЬНО простой пример. Это в основном позволяет вам C: \ управлять 3-мя каталогами и JTextArea содержимое в поставляемый JTextArea

 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); } } } } 

Вы просто вызываете new BackgroundWorker(textField).execute() и new BackgroundWorker(textField).execute() : D

ОБНОВЛЕНО с явным примером

 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); } } 

Теперь запустить ...

 new BackgroundWorker(textArea, sourceDir, destDir).execute(); 
  • Ядро Java swingWorker работает, но не получено или передано сообщение
  • Как отменить выполнение SwingWorker?
  • Предотrotation блокировки графического интерфейса Swing во время фоновой задачи
  • SwingWorker не отвечает
  • Проблемы с SwingWorker и JProgressBar
  • Как имитировать буферизованное периферийное устройство с SwingWorker?
  • SwingWorker в Java
  • Может ли индикатор выполнения работать в classе за пределами основного?
  • Как заставить пример SwingWorker работать правильно?
  • Ожидание нескольких SwingWorkers
  • SwingWorker в другом методе SwingWorker
  • Давайте будем гением компьютера.