0

誰かがこの下に書かれたコードを説明してもらえますか?

public void setSelectedFolder(final File f){
    if(f != null){
        Runnable r=new Runnable(){
            public void run(){
                target.setText(f.toString());
            }
        };

        try {
            SwingUtilities.invokeLater(r);
        } catch(Exception x) {
        }
    }
}

これは、ユーザーがフォルダーからファイルを選択し、このファイルをチャンクに分割できるようにする Java プログラムの一部です。

4

2 に答える 2

1
  • あなたのコードはデザインが間違っています。

  • Swingの同時実行に問題があります

  • FileIOtry - catch - finallyではなく、ブロック内にラップする必要がありますinvokeLater

  • すべてが終了した場合、AWT/SwingGUI への出力を内部でラップできますinvokeLater

  • このアイデアにはSwingWorker(ev. ) を使用しますRunnable#Thread

于 2013-05-12T12:34:39.923 に答える
1

public static void invokeLater(Runnable doRun)
doRun.run() が AWT イベント ディスパッチ スレッドで非同期に実行されるようにします。これは、保留中のすべての AWT イベントが処理された後に発生します。このメソッドは、アプリケーション スレッドが GUI を更新する必要がある場合に使用する必要があります。

コードが実行する唯一のことは、target.setText(f.toString());そこで実行される EDT を挿入し、TextField安全に更新することです。そうしないと、Swing がスレッドセーフではないため、醜いバグに直面する可能性があります。
常に EDT に何かを入れるのは読みやすさに良くないので、SwingWorkerは GUI 関連の長時間実行タスクをすべて同期するという大変な作業を行いますが、この単純なケースでは、それらSwingWorkerの作業をあなたに代わって行う必要はありません。長い待ち時間のないシンプルなセッターです。

これは 用です。この場合SwingUtilies.invokeLater()、は、EDT が実行する必要があるコードを定義するメソッドを持つために使用されます。通常は を作成するために使用します。 しかし、それはまた別の大きな章であり、インターネット上で多くの情報を見つけることができます.Runnablerun()RunnablesThread

于 2013-05-12T12:39:21.127 に答える