1

我试图在复制这些照片时更新这个JTextArea,称为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();
        }
    }

然后我把它改成这样:

public void copyPictures(){
    SwingUtilities.invokeLater(new Thread(){
        public void run(){
            String name = "";
            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();
                }
            }
        }
    });
}

以同样的结果。有什么建议么?

另外,有没有办法让文本进入文本区域的顶部?

4

2 回答 2

1

如何在开头插入文本已经得到解答。您问题的另一部分与往常一样......您正在事件调度线程上执行繁重的工作,该线程不再能够执行重绘。

您应该做的是在工作线程上执行繁重的工作,并且只更新 EDT 上的 UI。例如,您可以使用SwingWorker专为此设计的 a 。或者更简单,采用您当前的代码并进行一些简单的修改

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 教程或 SO 上找到(搜索的关键字是SwingWorker,这将导致大量示例,因为这是一个日常问题)

于 2012-05-07T06:29:24.467 回答
0

不知道你在问什么,标题似乎是说文本没有更新,但你的问题似乎表明它没有被插入到你想要的位置......

如果是后者,请改用插入方法

    textArea.insert("Copied " + name + "\n",0);

将其放在文本区域的顶部。

于 2012-05-07T01:16:29.807 回答