正在进行复制时在JTextArea中显示

时间:2012-12-04 00:44:49

标签: java swing

当复制正在进行时,我需要在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);
        }
    }
}

1 个答案:

答案 0 :(得分:3)

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

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

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

最容易实现

查看Concurrency in Swing,特别是The Event Dispatch ThreadWorker Threads and SwingWorker

可以找到例子