我正在尝试将这个名为JTextArea
的{{1}}更新,同时复制这些照片,但我似乎无法让它工作。我使用的是这段代码:
textArea
然后我把它更改为:
String name = "";
int numberOfPicturesCopied = 0;
while (pictures.isEmpty() == f) {
try {
File tmp = pictures.firstElement();
name = tmp.getName();
String filename = destination + Meta.date(tmp) + tmp.getName();
Path source = tmp.toPath();
File destFile = new File(filename);
Path destination = destFile.toPath();
Files.copy(source, destination,
StandardCopyOption.COPY_ATTRIBUTES);
textArea.append("Copied " + name + "\n");
pictures.removeElementAt(0);
numberOfPicturesCopied++;
} catch (FileAlreadyExistsException faee) {
textArea.append("Skipped " + name
+ ": Picture Already In Computer\n");
} catch (NoSuchFileException ncfe) {
File tmp = pictures.firstElement();
String filename = destination + Meta.date(tmp);
File newDir = new File(filename);
newDir.mkdir();
} catch (IOException ee) {
// TODO Auto-generated catch block
ee.printStackTrace();
}
}
结果相同。有什么建议吗?
另外,有没有办法让文字进入文本区域的顶部?
答案 0 :(得分:1)
如何在开头插入文字已经得到解答。您的问题的另一部分与以往一样......您正在对事件调度线程执行繁重的工作,该线程无法再执行重新绘制。
您应该做的是在工作线程上执行繁重的工作,并且只更新EDT上的UI。例如,您可以使用专为此设计的SwingWorker
。或者甚至更简单,使用您当前的代码并进行一些简单的修改
public void copyPictures(){
new Thread(){
public void run(){
while(pictures.isEmpty() == f){
try {
File tmp = pictures.firstElement();
final String name = tmp.getName();
String filename = destination + Meta.date(tmp) + tmp.getName();
Path source = tmp.toPath();
File destFile = new File(filename);
Path destination = destFile.toPath();
Files.copy(source, destination, StandardCopyOption.COPY_ATTRIBUTES);
SwingUtilities.invokeLater(
new Runnable(){
public void run(){
textArea.append("Copied " + name + "\n");
}
}
);
pictures.removeElementAt(0);
numberOfPicturesCopied++;
} catch(FileAlreadyExistsException faee){
textArea.append("Skipped " + name +": Picture Already In Computer\n");
} catch (NoSuchFileException ncfe){
File tmp = pictures.firstElement();
String filename = destination + Meta.date(tmp);
File newDir = new File(filename);
newDir.mkdir();
} catch (IOException ee) {
// TODO Auto-generated catch block
ee.printStackTrace();
}
}
}
}.run();
}
了解如何在单独的Thread
上完成工作,但在EDT上更新了UI。可以在Swing Concurrency tutorial或SO上找到更多信息(搜索的关键字为SwingWorker
,这会产生一堆示例,因为这是一个每日问题)
答案 1 :(得分:0)
不确定你在问什么,标题似乎是说文字没有更新,但是你的问题似乎表明它并没有被插入到你想要的地方......
如果是后者,请使用insert方法
textArea.insert("Copied " + name + "\n",0);
将其放在文本区域的顶部。