0

我需要在复制过程中system.out.println显示所有语句。JTextArea我尝试给出 ta.append 而不是 println 语句,但它不会显示。请让我知道我应该如何去做。

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

1 回答 1

3

Swing 是一个事件驱动的环境,这包括但不限于键盘、鼠标和绘画事件。

这些事件由事件调度线程传递。阻塞此线程的任何操作(例如但不限于循环、I/O 或Thread#sleep)都将阻止(除其他外)开始处理绘制请求。这将使您的应用程序停止响应键和鼠标事件,并使其看起来像挂起一样。

解决问题的最简单方法是将物理复制过程移至单独的线程。这最容易通过使用SwingWorker.

看一下Swing 中的并发,特别是Event Dispatch ThreadWorker Threads 和 SwingWorker

可以找到例子

于 2012-12-04T00:59:43.690 回答