0

コピーの進行中にすべてのsystem.out.printlnステートメントを表示する必要があります。JTextAreaprintlnステートメントの代わりにta.appendを指定しようとしましたが、表示されません。どうすればいいのか教えてください。

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の同時実行性、特にイベントディスパッチスレッドワーカースレッドおよびSwingWorkerを見てください。

例を見つけることができます

于 2012-12-04T00:59:43.690 に答える