3

次の行:

SwingUtilities.updateComponentTreeUI(aComponent);

GUIが応答しなくなります。

このメソッドを呼び出してGUIの大部分のlafを更新すると、時間がかかるため、この操作中にGUIが応答しなくなります。

この操作はGUIを操作しているため、SwingWorkerを使用することもできません。SwingWorkerのドキュメントから:

  • 時間のかかるタスクは、イベントディスパッチスレッドで実行しないでください。そうしないと、アプリケーションが応答しなくなります。

  • Swingコンポーネントには、イベントディスパッチスレッドでのみアクセスする必要があります。

ただし、ここでの問題は、操作がSwingコンポーネントアクセスしていて、時間がかかることです。

この無反応を防ぐ良い方法はありますか?

4

2 に答える 2

2

あなたがしていることはL&Fを変更することであり、それはGUIの外観と使いやすさに深刻な影響を与える可能性があるので、その間にアプリケーションを本当に応答させたいかどうかを自問してください。ガラス板を使用してメッセージ(「お待ちください...」など)を表示し、L&Fが更新されている間GUIをフリーズする方がよい場合があります。

さて、他の人が示唆しているように、コンポーネントツリーの更新が非常に遅い理由を調査することをお勧めします。

于 2011-05-04T11:25:41.267 に答える
0

GUIを調べて、多くのサブコンポーネントを含む、またはそれ自体を再検証するための異常な方法や非効率的な方法を備えたカスタムコンポーネントまたはサードパーティコンポーネントを特定することをお勧めします。日付ピッカーが深刻なボトルネックだったとおっしゃっていたように、そうだったようです。

呼び出しをupdateComponentTreeいくつかのサブタスクに分割して、その間にイベントを発生させることを提案しました。これは「ハック」である可能性がありますが、フォントの変更によって要素のサイズが変更され、ユーザーが見逃す可能性がある場合を除いて、それほど悪くはありません。ボタンなど。

可能であれば、日付ピッカーコンポーネントのコードを調べて、ポップアップでコンポーネントを非表示にする代わりに、実際にコンポーネントを削除/破棄し、必要に応じて再作成するように書き直すことができるかどうかを確認することをお勧めします。これは、使用中の日付ピッカーの応答性に目立った影響を与えないはずですが、ポップアップが表示されていない場合は、コンポーネントツリーの更新を確実に高速化します。

于 2011-05-04T10:56:22.523 に答える