3

Java で GUI を実装しようとしていますが、swing の初心者です。はっきりさせておきたいことがあります。GUI の応答性を維持するには、SwingWorker クラスを使用して別のスレッドでタスクを実行する必要があることを読みました。わかりました。いいえ、リモート メソッドである約 15 のメソッドを含むモデルがあります。各メソッドは、結果として、他のメソッドとは異なるオブジェクト タイプを返します。私の見解では、ユーザーがボタンを押すと、モデル内の適切なメソッドが呼び出されます。swingworker を使用しないと、GUI がフリーズしました。私の質問は、Swingworker スレッドの 15 のサブクラスを作成し、ユーザーのアクションに従って、必要に応じてそれぞれの新しいインスタンスを作成することになっているのでしょうか? 私の理解は正しいですか?これには標準的な方法がありますか、それとも私が言うことは正しいアプローチですか?

ありがとう!

4

2 に答える 2

2

これを見てください: Simple Background Tasks

2つの懸念があるようです。まず、 を使用するときに必要なコードの量についてSwingWorker: アクションごとに のサブクラスを作成する必要がありますSwingWorkerが、それはそれらがトップレベルの名前付きクラスである必要がある、または独自のファイルである必要があるという意味ではありません。コードが GUI のイベント処理コード内にあるように、記事に示されているように匿名クラスにすることができます。

次に、オブジェクトのインスタンス化に関してSwingWorker: を再利用することはできませんSwingWorkerが、ジョブはユーザー アクティビティ (ボタンのクリックなど) の結果として実行されるため、毎回新しいオブジェクトをインスタンス化する際にパフォーマンスの問題が発生することはありません。

于 2010-08-28T22:03:33.427 に答える
0

とにかく、SwingWorkers は仕事を成し遂げます。私の経験では、SwingWorkers を 1 つの小さな作業に使用するのは好きではありません。私はスレッドを生成し、そのスレッドに EventDispatch スレッドに GUI の更新を依頼することを好みます。いくつかの例外はありますが、EventDispatch スレッドだけが UI を更新する必要があります。

Swingのスレッド内のスレッドについて読むことをお勧めします。

スレッド化が重くなる可能性があり、この解決策がすべての場合にうまくいくとは限りませんが、別のスレッドが GUI の変更を引き起こす必要がある場合は、次のようなものを使用します。

java.awt.EventQueue.invokeLater(new Runnable() 
{ 

    public void run() 
    { 
        // this codes runs on the event dispatch thread 
        // update the ui here.
    } 
}); 
于 2010-09-01T17:16:44.750 に答える