2012-05-06 65 views
1

我試圖讓JTextArea這個名爲textArea的圖片在它複製這些照片時進行更新,但我似乎無法完成它的工作。我用這個代碼:需要在JTextArea中實時更新

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(); 
       } 
      } 
     } 
    }); 
} 

具有相同的結果。有什麼建議麼?

此外,有什麼辦法讓文本進入文本區域的頂部?

+0

1)爲了更好的幫助,請儘快發佈[SSCCE]( http://sscce.org/)你最好的嘗試。你嘗試過的其他東西可以用(例如)'copyPictures2()'方法表示。 2)看來你阻止了美國東部時間。使用'SwingWorker'。 –

+0

'SwingUtilities.invokeLater(new Thread())'是平坦的錯誤。您需要乾淨地分離您在後臺線程上執行的文件I/O工作與Swing組件的更新,這些工作應該在EDT上完成。 – wolfcastle

回答

0

不知道你所問的,標題似乎在說,文心不是更新,但你的問題似乎表明,你希望它是是心不是插入...

如果其後者,使用插入方法代替

textArea.insert("Copied " + name + "\n",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尚未完成的UI更新的EDT。更多信息可以在Swing Concurrency tutorial或SO上找到(關鍵字爲您的搜索是SwingWorker,這將導致一堆例子,因爲這是一個日常問題)