1

AWT を使用する Java アプレットがあります。一部の (まれな) 状況では、プラットフォームが画面を適切に更新しません。ウィンドウを移動または最小化/最大化して、アプレットが適切に更新されたことを確認できます。最小化/最大化の動作をシミュレートして、可能な限りアプレット画面を再描画できるコードを探しています。

親コンテナーで paint()/repaint()/invalidate()/update() のさまざまな組み合わせを呼び出し、さまざまな子で再帰を試みました。ただし、遭遇したフレームワークのバグを解決する組み合わせ (私が見つけたもの) はありません。問題のあるプラットフォームでのみこのコードを呼び出すため、わずかなちらつきが発生する可能性がある場合でも、アプレットを完全に更新する手法を探しています。

私のテストでは、Swing に移行しても問題は解決しませんでした。

ところで、これは私の以前の (より複雑な) 投稿を単純化したものです: Java Applet, AWT Refresh problem Mac OS X 10.4

編集: スレッド化の調査では、この問題は解決されませんでした。最良の回答を良いものとしてマークします。

4

5 に答える 5

2

これは、AWT/Swing で注意深くプログラミングしていないと、常に発生します。

まず、イベント スレッドですべての作業を行う必要があります。これは、メインステートメント (またはそれが直接呼び出すもの) でそれを実行できないことを意味します。これまでに発明されたすべての Java GUI アプリがこの規則に違反していることは知っていますが、それが規則です。

ほとんどの場合、ウィンドウが「実現」(pack/setVisible) されるまで awt 以外のスレッドを使用できると言われていましたが、Sun はそれが常に機能するとは限らないことを突き止めました。

第 2 に、AWT スレッドでイベントを受け取ったら、すぐに返すようにしてください。スリープや長時間の操作は絶対にしないでください。

3 番目に (これは「First」の拡張です。AWT ワーカー スレッドにまだないコールバックを取得した場合は、GUI で何かを行う前に必ず AWT スレッドに配置してください。

一般に、AWT コンポーネントによって生成されたイベントは、正しいスレッド上にあります。タイマーによって生成されたイベント、手動で作成されたスレッド、または main() に渡されたものはそうではありません。

于 2008-10-13T22:30:23.513 に答える
1

あなたが言及したように、この種の問題に使用する方法は再描画です。使用している JVM に問題がある可能性があります。別のバージョンの Sun JVM と IE 用の MS VM を使用して、これが VM 関連の問題であるかどうかを確認することをお勧めします。実際にはコードとは無関係である可能性があります。

私は実際にこれを試したことはありませんが、これを回避する創造的な方法 (つまり、厄介なハック) は、アプレットから JavaScript を実行して DOM メソッドを呼び出して、ウィンドウのサイズ変更のモックを実行するか、ボディにフォーカスを呼び出すことです。キャンバスの外部再描画を引き起こす試み。

于 2008-10-13T22:10:40.777 に答える
1

これがあなたが見たものに関連しているかどうかはわかりませんが、AWT イベント キューのパフォーマンスに逆らうと、Java 2d + 3d ワールド (グラフィックス パイプライン関係者) がスレッド化された戦略を指し示すようになり、次のようになります。処分問題。

この議論は、「再描画」を使用する場合のように、グラフィックスに AWT イベント キューを使用する設計を検討してきました。

スレッド化されたアプローチでは、シャットダウンの問題があります。

「dispose」に関する java/awt/SequencedEvent のメモは、「AWT スレッドの問題」と「自動シャットダウン」を示しています。

このちょっとした情報は、少なくとも問題を解決するのに役立つと思います。

于 2009-11-06T16:46:52.650 に答える
0

あなたが経験しているものと同じように見える問題を見つけました。いくつかのテストの後、これは Aero および Intel グラフィックス アダプターに関連している可能性があることがわかりました。私の場合、バッテリー駆動の AC アダプターなしのノートブックで使用した場合にのみ、アプリケーションが再描画を停止しました。Intel ドライバー構成で一部の省電力機能 (特に古いドライバー リリースの Intel 2D Display Technology) を無効にすると、Java は正常に再描画されます。

私の場合、レジストリを介してこのオプションを無効にする方法も見つけました。文書化されていませんが、機能します。

于 2011-05-23T17:30:11.617 に答える
0

Swing に切り替えることで、AWT アプレットの再描画の問題の 99% を修正できました。リフレッシュはスイングの方が頼りになりそうです。

以前はアプレット コードに多くの手動 repaints() がありましたが、Swing ではこれらが削除され、アプレットは特に Terminal Server / LTSP の下でより高速になりました。

この中に重要なものを配置しました:

public class VeryFastPanel extends JPanel {



    /**
         *
         */
        private static final long serialVersionUID = 1L;

        public void update(Graphics g) {

      paint(g);
    }

}
于 2008-10-14T13:03:02.677 に答える