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、このために設計された を使用できます。またはさらに簡単に、現在のコードを使用して、いくつかの簡単な変更を加えます

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 チュートリアルまたは SO を参照してください (検索のキーワードは です。SwingWorkerこれは日常的な質問であるため、多くの例が表示されます)。

于 2012-05-07T06:29:24.467 に答える
0

何を求めているのかわからない、タイトルはテキストが更新されていないことを示しているようですが、あなたの質問はそれがあなたが望む場所に挿入されていないことを示しているようです...

後者の場合は、代わりに挿入メソッドを使用してください

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

テキスト領域の上部に配置します。

于 2012-05-07T01:16:29.807 に答える