0

さて、私は以下で説明するように機能するアルゴリズムを持っています。イベント ディスパッチ スレッドの代わりに別のスレッドで再描画する方法を知りたいと思いました。

Input an ArrayList of 2 Dimensional Point objects.
while(each point object has not been a starting point)
LOOP

   Arbitrarily choose a starting point
   Find the shortest path through all nodes
   Call repaint() on the JPanel that displays this path.

END LOOP

私の質問は、最短パスが計算されるたびに JPanel を再描画するスレッドにパスを送信するように別のスレッドを設定するにはどうすればよいですか? repainting() の時間を無駄にしているように感じ、これによりメソッドがはるかに高速になる可能性があるため、これを実行したいと考えています。

単純に言うことはできないと思います:

new Thread() {
    void run() {
        myJPane.repaint();
    }
}.start()

...それは毎回新しいスレッドを作成するためです。これを論理的に行うにはどうすればよいですか?

4

2 に答える 2

4

シンプルに、 を使用しSwingWorkerます。ASwingWorkerには、実行時間の長い操作の結果を公開し、それらの結果を EDT で処理するためのメソッドがあります。

だから基本的に...

public class PathFinderWorker extends SwingWorker<Void, Path> {
    protected Void doInBackground() throws Exception {
        Input an ArrayList of 2 Dimensional Point objects.
        while(each point object has not been a starting point) 
        LOOP
            Arbitrarily choose a starting point
            Find the shortest path through all nodes
            publish(path);

        END LOOP
    }

    protected void process(List<Path> paths) {
        // Process the results as required...
    }
}

おもしろいことrepaintに、これは設計上、実際にスレッド セーフな数少ないメソッドの 1 つです。

つまり、特定の領域を再描画するようにrepaint要求します。近い将来、イベントをイベント キューにスケジュールRepaintManagerし、イベント ディスパッチ スレッドによって処理されます...安全に...RepaintManagerpaint

詳細については、Swing での同時実行をご覧ください。

于 2013-09-09T10:29:32.850 に答える
0

EDT でペイントし、他のスレッドで作業を行います。EDT は、GUI を処理するためのものです。そこに別のスレッドを関与させようとすると、失敗することが保証されます。

本当の問題は、値またはデータ構造を「ワーカー」スレッドからペイント用の UI に戻す方法です。

おそらく、これに関して最近見た中で最も単純なデータ構造は、それぞれが前のノードへのバックポインターを持つ一連のノードでした。それらは不変であるため、表示のためにスレッド間で安全に渡すことができます。

于 2013-09-09T10:09:22.713 に答える