これは、そこにいるスイングの専門家のためのものです。私はこの問題にかなりの時間を費やしてきたので、問題を説明するのに数行かかります。
スタンドアロンのJavaSwingアプリケーション(Java 6)があります。私のアプリケーションでは、ラジオボタングループのあるフレームがあります。グループ内のすべてのボタンにリンクされた単一のアクションがあります。このアクションは、どのラジオボタンが選択されているかを確認し、いくつかの作業を実行します。「作業」には、バックグラウンドの計算と、アプリケーション内の他の2つのフレームでのペイントが含まれます。バックグラウンド計算はマルチスレッドです。
ユーザーがラジオボタンの1つを選択すると、プログレスバーを表示したいと思います。ただし、ラジオボタンが選択されている場合、ラジオボタンへのアクションが発生している間は、進行状況バーは表示されません。jdialogタイプのプログレスバーやガラス板などを試しましたが、「作業」がすべて完了するまで表示されません。これは、対応するアクションの「作業」が完了するまで、Swingがラジオボタンのペイントを終了しないためと思われます。また、EDTは一度に1つのことしか実行しないため、プログレスバーダイアログ(またはガラスペイン)が表示されることはありません。
次に、SwingWorkerを使用してこのすべての「作業」を実行しようとしました。SwingWorkerのdone()メソッドでプログレスバーを起動(またはガラスペインをアクティブ化)し、SwingWorkerを起動してプログレスバーを閉じます(またはガラスペインを非アクティブ化します)。これでプログレスバーは正常に表示されるようですが、「作業」の一部であるペイントが完了せず、ペイントのアーティファクトが残ることがあります(paintComponentメソッドはかなり複雑なので、ここで再現したくありません)。ウィンドウのサイズを変更すると、アーティファクトが消えます。実際、これは、SwingWorkerの代わりにThreadを拡張するクラスを使用した場合にも発生します。これはすべて、Swingがスレッドセーフではなく、EDT以外のスレッドからGUI作業を実行しようとしているためです。私はその部分を理解しています。
私は何をしますか?「作業」には約30秒かかりますが、プログラムが機能していることをユーザーに示すことなく、それを行うには長すぎるようです。また、カーソルを待機カーソルに変更しようとしましたが、上記と同じ問題が発生しました。私にできることは、フレームを無効にして、フレームのタイトルを「working...」のようなテキストに設定することだけです。
誰かが以前にこの問題を見ましたか?