需要在JTextArea中进行实时更新

时间:2012-05-06 22:53:44

标签: java multithreading swing jtextarea

我正在尝试将这个名为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();
        }
    }

结果相同。有什么建议吗?

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

2 个答案:

答案 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);

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