Java Applet、AWT Refresh、Mac OS X 10.4の問題
質問
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を介して行われます。これは、間違えない限り、正しいスレッドで実行する必要があります。この問題は、(ロード中に)余分なスレッドが実行されていない場合でも、スクロールするときに最も深刻です。
解決
これは、軽量(通常はSwing)コンポーネントと重量(AWT)コンポーネントを一緒に混合するように見えます。 Swingに移動するには、最後のAWTコンポーネントのSwingに相当するものをすべて置き換える必要があります(ヒント:java.awt。*のインポートは避けてください)。
スレッドは、奇妙なバグの潜在的な問題です。 Swingコンポーネントは常にEDTで使用する必要があります( java.awt.EventQueue.invokeLater
を使用)。 AWTはスレッドセーフであるという理論ですが、実際にはそうではありません-EDTの使用も制限します。
他のヒント
すでにJava 1.4が必要なため、SWING GUIを使用するためにいくつかの小さな変更を検討する必要があります。これにより、AWTのアプレット更新の問題が解決されました。 (Mac、Linuxなど)
たとえばパネル、JPanelなどに置き換える必要があります。
これが必要です:
import javax.swing.*;