2

を使用してファイルから画像をロードする画像ギャラリーを作成する必要がある課題がありSwingWorkerます。画像がロードされると、画像を反転してスライドショーを再生できます。を使用してロードされたイメージのリストを取得するのに問題がありますSwingWorker

これは、結果を TextArea にパブリッシュするバックグラウンドで発生することです。

 // In a thread
@Override
public List<Image> doInBackground() {
List<Image> images = new ArrayList<Image>();
for (File filename : filenames) {
  try {
    //File file = new File(filename);
    System.out.println("Attempting to add: " + filename.getAbsolutePath());
    images.add(ImageIO.read(filename));
    publish("Loaded " + filename);
    System.out.println("Added file" + filename.getAbsolutePath());
  } catch (IOException ioe) {
    publish("Error loading " + filename);
  }
}
return images;

}
}

完了したら、画像を a に挿入するだけList<Image>です。

// In the EDT

@Override protected void done() { 試行 {

  for (Image image : get()) {
    list.add(image);
  }



} catch (Exception e) { }

}

また、取得する必要があるのはリストからlist呼び出されたものを返すメソッドを作成しましたが、たとえば呼び出したときに機能しませんgetImages()getImages()execute()

MySwingWorkerClass swingworker = new MySwingWorkerClass(log,list,filenames);
swingworker.execute();
imageList = swingworker.getImage()

に到達するimageListと、何も返されません リストを取得できた唯一の方法は、リストを取得する別の方法がありますか、それともメソッドが唯一の方法ですか?のrun()代わりに を使用したときでした。または、おそらくクラスを理解していません。execute()run()Swing Worker

4

3 に答える 3

1

SwingWorkerあなたは少し誤解していると思います。getImage()そのほとんどは正しいですが、直後に呼び出すことはできませんexecute().execute呼び出しはすぐに戻り、画像はワーカースレッドにロードされています. そのため、 への即時呼び出しにgetImages()は取得する画像がありません。

これを修正するには、done()オーバーライドで画像処理を行う必要があります。たとえば、画像を表示する UI コンポーネントに画像を追加します。

于 2010-05-03T20:23:03.000 に答える
1

SwingWorker...または、クラスを理解していない可能性があります。

のライフサイクルに注意する必要がありますSwingWorker。execute を呼び出すと、処理がバックグラウンド スレッドに切り替わり、現在のスレッドがすぐに戻ります。これが、getImages何も返さない理由です。javadocから:

ワークフロー

SwingWorker のライフサイクルには、次の 3 つのスレッドが関係しています。

現在のスレッド: このスレッドで execute() メソッドが呼び出されます。ワーカースレッドでの実行のために SwingWorker をスケジュールし、すぐに戻ります。get メソッドを使用して SwingWorker が完了するのを待つことができます。

ワーカー スレッド: doInBackground() メソッドがこのスレッドで呼び出されます。これは、すべてのバックグラウンド アクティビティが発生する場所です。バインドされたプロパティの変更について PropertyChangeListeners に通知するには、firePropertyChange および getPropertyChangeSupport() メソッドを使用します。デフォルトでは、state と progress の 2 つのバインドされたプロパティを使用できます。

イベント ディスパッチ スレッド: Swing 関連のすべてのアクティビティは、このスレッドで発生します。SwingWorker は process メソッドと done() メソッドを呼び出し、このスレッドのすべての PropertyChangeListeners に通知します。

于 2010-05-03T20:29:24.767 に答える
0

パブリッシュ プロセス メカニズムを使用して、中間結果をバックグラウンド ワーカー スレッドから に送信しないのはなぜEDTですか? SwingWorker#publish(V)タスクの進行状況をユーザーに伝えるために使用しているようで、スレッドの進行状況を確認したり、 PropertyChangeListener.

ワーカーを変更して Images 参照をEDTand overrideSwingWorkerprocess(List<V> chunks)メソッドに送信し、その Images を で受け取りEDT、コンポーネントのモデルを更新して画像を表示します。

public class SwingWorker<Void,Image> {
    @Override
    public Void doInBackground() {
        Image img;
        while(....) {
            img = downloadImage();
            publish(img);
        }    
    }

    @Override
    public void process(List<Image> images) {
        //you are on the EDT now   
    }
}

SwingWorker#get()メソッドを呼び出すと EDT をブロックできますが、公開プロセス メカニズムを使用すると、1 枚の写真が利用可能になるたびに UI を更新できますが、他の写真はまだインターネットからダウンロードしているか、ディスクからロードしています。

于 2010-06-28T10:01:41.683 に答える