AWT を使用して構築された Java アプレットがあります。このアプレットを使用すると、ハード ドライブから画像を選択してサーバーにアップロードできます。アプレットにはスクロール可能な画像のリストが含まれており、Windows、Linux、および Mac OS X 10.5 で正常に動作します。このアプレットは、Java Web Start 経由または Web ページ内で起動します。
弊社のアプレットは、Java のバージョン (1.4 または 1.5) に関係なく、Mac OS X 10.4 では正しく動作しません。スクロール時の誤った動作のスクリーンショットは、次の場所にあります。
http://www.lavablast.com/tmp/ui_error.png
簡単に言えば、画像をスクロールすると、アプリケーションのヘッダーまたはフッターに重なってしまうことがあります。この動作は、他のプラットフォームでは発生しません。Mac OS X 10.4 では、スクロールすると画像が間違った場所に表示されますが、その場所に画像を描画した後に画面を更新すればそれほど問題にはなりません。ただし、アプリケーションが誤って描画したことを認識していないため、更新されていないようです。
ウィンドウが最小化、サイズ変更、または移動されると、アプリケーションが更新され、正しく配置されていない要素が消えて、アプリケーションが通常どおり再開されます。背景画像を強制的に更新しようとしてかなりの時間を費やしましたが、失敗しました。(画像を直接再描画する、いくつかのパネルのすべての子を再描画するなど)したがって、Mac OS X 10.4でこの問題を解決するのに役立つヒントを探しています。最悪の場合、単に完全なアプレットをシミュレートしますリフレッシュ。
最近まで、すべてが Java 1.1 と互換性がありましたが、現在は 1.4 を必要とするいくつかの場所で変更されています。これらの変更が問題を引き起こしたとは思いません。追加情報として提供しているだけです。スクロール パネルの実装の詳細に興味がある場合は調査しますが、これは回避策を知っておく必要がある一般的なプラットフォームのバグであると想定しています。
問題を再現するには、次の Java Web Start アプリケーションを開きます: http://www.lavablast.com/tmp/opal-webstart.php.jnlp
たくさんの画像を含むフォルダを選択し、スクロールバーで遊んでください。ある時点で (かなり迅速に)、リフレッシュの問題が発生するはずです。
編集: ここで最初の提案に従い、背景画像を備えたすべてのコントロールを Swing の同等のものに置き換えましたが、問題はまだ残っています。(さらに、完全な変更を行うには他にも多くの修正が必要です)。他のアイデアはありますか?完全な更新を強制する単純な1行のコードは素晴らしいでしょう:)
Edit2: メイン スレッドがパネルを作成し、X スレッドを起動します。オブザーバー/通知パターンを使用して、スレッドが完了し、メイン コントロールに通知します。これにより、ページにパネルが追加されます。これは EventQueue.invokeLater を介して行われます。私が間違っていない限り、正しいスレッドで実行する必要があります。この問題は、余分なスレッドが実行されていなくても (ロード中など)、スクロールするときに最も深刻になります。