当复制正在进行时,我需要在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);
}
}
}
答案 0 :(得分:3)
Swing是一个事件驱动的环境,包括但不限于键盘,鼠标和绘画事件。
这些事件由Event Dispatching Thread提供。阻止此线程的任何操作(例如但不限于循环,I / O或Thread#sleep
)将阻止(除其他事项)绘制请求开始处理。这将使您的应用程序停止响应键和鼠标事件,并使其看起来像挂起。
解决您问题的最简单方法是将物理复制过程移至单独的线程。使用SwingWorker
。
查看Concurrency in Swing,特别是The Event Dispatch Thread和Worker Threads and SwingWorker
可以找到例子