質問

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

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

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

ところで、これは以前の(より複雑な)投稿の簡略化です: Javaアプレット、AWTリフレッシュの問題Mac OS X 10.4

編集:スレッドの調査では、この問題は解決しませんでした。ベストアンサーを良いものとしてマークします。

役に立ちましたか?

解決

AWT / Swingで慎重にプログラミングしていない場合、これは常に発生します。

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

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

2番目に、AWTスレッドでイベントを取得するときは、必ずすばやく返してください。スリープしたり、長時間の操作を実行したりしないでください。

3つ目(これは" First"の拡張機能です。AWTワーカースレッド上にないコールバックを取得する場合は、GUIで何かを行う前にAWTスレッド上に配置してください。

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

他のヒント

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

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

これがあなたが見たものに関連しているかどうかはわかりませんが、AWT Event Queueのパフォーマンスに立ち向かうと、Java 2d + 3dの世界(グラフィックパイプラインの人々)はスレッド化された戦略を指し示します。処分問題に陥ります。

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

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

" dispose"に関するjava / awt / SequencedEventの注意事項「AWTスレッドの問題」を指摘してください。および「自動シャットダウン」。

この情報は、少なくとも問題の焦点を合わせるのに役立つと考えています。

Swingに切り替えることで、AWTアプレットの再描画の問題の99%を修正できました。 Swingは、更新時により信頼できるようです。

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

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

public class VeryFastPanel extends JPanel {



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

        public void update(Graphics g) {

      paint(g);
    }

}

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top