0

I need to have all the system.out.println statements to be displayed on the JTextArea when the copying is in progress. I tried giving ta.append instead of the println statements but it won't desplay. Please let me know how should I go about doing this.

public class copy {

    public static void main(String args[]) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                Copy c = new Copy();
                c.setTitle("Copy folders");
                c.setVisible(true);
            }
        });

        JPanel jp = new JPanel();

        TextArea ta = new JTextArea(5, 50);
        ta.setEditable(false);
        DefaultCaret caret = (DefaultCaret) ta.getCaret();
        caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
        JScrollPane scrollPane = new JScrollPane(ta, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
                JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        scrollPane.setBounds(6, 625, 1035, 296);
        jp.add(scrollPane); //Adding to JPanel    
    }

    public Copy() {
        build();
    }

    public void build() {
        String source = "\\hostname\\d$\\somedirecotry";
        String detination = "\\C:\\foldername";
        File s = new File(source);
        File s2 = new File(detination);

        if (!s.exists()) {
            System.out.println("Directory does not exist.");
        } else if (!s2.exists()) {
            System.out.println("Directory is not accessible or Server is down");
        } else {
            try {
                copyFolder(s, s2);
            } catch (IOException e) {
                e.printStackTrace();
                System.exit(0);
            }
        }
        System.out.println("Done");
    }

    public static void copyFolder(File src, File dest)
            throws IOException {
        if (src.isDirectory()) {
            //if directory not exists, create it
            if (!dest.exists()) {
                dest.mkdir();
                System.out.println("Directory copied from " + src + "  to " + dest);
            }

            //list all the directory contents
            String files[] = src.list();

            for (String file : files) {
                File srcFile = new File(src, file);
                File destFile = new File(dest, file);
                copyFolder(srcFile, destFile);
            }
        } else {
            //if file, then copy it
            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);
        }
    }
}
trashgod
  • 203,806
  • 29
  • 246
  • 1,045
user1815823
  • 617
  • 2
  • 8
  • 14

1 Answers1

3

Swing is an event driven environment, this includes, but is not limited to, keyboard, mouse and paint events.

These events are delivered by the Event Dispatching Thread. Any operation (such as, but not limited to, loops, I/O or Thread#sleep) that blocks this thread will prevent (amongst other things) paint requests from begin processed. This will make your application stop responding to key and mouse events as well as make it look like its hung.

The easiest fix to your problem is to move the physical copy process to a separate thread. This is most easily accomplished by using a SwingWorker.

Take a look at Concurrency in Swing, in particular The Event Dispatch Thread and Worker Threads and SwingWorker

Examples can be found

Community
  • 1
  • 1
MadProgrammer
  • 343,457
  • 22
  • 230
  • 366