答えは簡単です。いいえ、 EDTを 2 つ持つことはできません。それは不可能です。しかし、フリーズした GUI で立ち往生しているわけではなく、いくつかのオプションを利用できます。
まず、2 つの重要なルールがあります。
- EDT で長い計算を行わないでください。これまで。
- EDT の外部から Swing コンポーネントを操作しないでください。これまで。
最初の規則に違反すると、GUI がフリーズし、その間はいかなる種類のイベントも処理されません。これには、計算中に実行したい GUI の更新が含まれますが、これは計算が完了するまで表示されません。
後者はしばしば無視され、ほとんどの場合気付かれませんが、お尻を噛む可能性があり、実際に噛む可能性があり、ほとんどの場合、戻って修正するのは大きなピタです. ですから、最初から正しい方法で行ってください。何が起こる可能性がありますか?EDT と他のスレッドとの間にデッドロックがあるため、コンポーネントが突然壊れた状態で表示されたり、白く表示されたり、アプリケーション全体がフリーズしたりする可能性があります。Oracle Swing スレッディング ポリシーを遵守してください。
では、たとえばユーザーがボタンを押した後に EDT で長い計算を行うのを避けるにはどうすればよいでしょうか? オプション:
- SwingWorkerを使用します。利点:
done()
ワーカーが完了すると、EDT で自動的に実行される使用可能なメソッドがあります。インターフェイスも実装しているFuture
ため、結果を返すために使用できます。
Runnable
独自のものを作成して、そこで計算を行うことができます。
- Java が並列実行のために提供するその他の方法を使用してください。
では、EDT の外部から GUI を操作しないようにするにはどうすればよいでしょうか?
SwingUtilities.invokeLater()
そこで Swing 操作を呼び出して実行します。
done()
上記のように SwingWorkers メソッドを使用します。
これら 2 つのルールに従えば、Swing GUI ははるかに優れた形になり、Swing の問題ではなく、アプリケーション開発にもっと集中できます。