Q123:処理中状態を画面に表示しようと思い、進捗バーコンポーネントを使って作成しようとしました。処理自体はエラーなく実行されますが、描画がうまくいきません。
Q123-1:
処理中状態を画面に表示しようと思い、進捗バーコンポーネントを使って作成しようとしました。処理自体はエラーなく実行されますが、描画がうまくいきません。
私の予想としては、私の作成したものは、swingのEDT外で描画しようとしているのではないかと思っております。(また、EDT上で実行する方法がわかりません。)
状況を説明するために、ファイルを添付いたします。
動かしてもらえばわかると思いますが、状況は、テーブルに動的に列を追加し列幅を設定しているが反映されない状態です。また、列自体が一部表示されないこともあります。
※進捗バーで進捗状態を表したいのではなく、処理実行中を表したいので処理中は、進捗バーが動き続けるように作成しております。
※テーブルコンポーネントの列は、動的に設定する前提になります。
関連ファイル:処理中.mzax
A123-1:
ご質問の件は、結論から申し上げますと、列の追加および列幅設定処理の速度に描画速度が追いつかないことが原因です。このことは、処理速度の遅いPCでは正しく実行できることや、テーブルを画面から外して処理を実行し、あらためて画面編集画面上でテーブルを張り付けてみると、列と列幅が正しく設定されていることからも、お分かり頂けることと存じます。
なお、列が表示されないのは描画の問題でつぶれてしまっているのが原因で、列自体は作成されています。
これを回避する方法として、場当たり的な方法ではありますが、タイマーコンポーネントを使って処理の間隔を調整するということが考えられます。お送りいただいたアプリケーションをそのように修正いたしましたので、どうぞご覧ください。
関連ファイルの"処理中-A.mzax"では、タイマーコンポーネントを用いて列追加&列幅設定の処理間隔を100msに指定し、また、繰り返し制御(FOR)コンポーネントに替えて、比較演算(<)コンポーネントを終了条件判定に用いています。
このような方法での動作不正回避は可能ですが、列が増えていく様子を画面上で確認する必要はなく、動的に列を増やし、かつ、列幅を設定することが目的であるならば、テーブル格納変数コンポーネントおよびリスト格納変数を使ってテーブルデータと列幅データを作成した後、それらをテーブルに設定する方法をお勧めします。こちらも修正したファイル"処理中-B.mzax"を用意しましたので、合わせてご覧ください。
追伸
アプリケーションファイルの保存サイズを抑えるため、アプリケーションの終了時には、テーブルの全削除あるいは全行削除、また、グラフやイメージビューワ―の場合にはデータのクリアを行っておくことをお勧めしています。
関連ファイル:処理中-A.mzax、処理中-B.mzax