0

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 を介して行われます。私が間違っていない限り、正しいスレッドで実行する必要があります。この問題は、余分なスレッドが実行されていなくても (ロード中など)、スクロールするときに最も深刻になります。

4

2 に答える 2

1

軽量 (通常は Swing) と重量 (AWT) のコンポーネントを混ぜ合わせているように見えます。Swing に移行すると、Swing の同等の AWT コンポーネントをすべて置き換える必要があります (ヒント: java.awt.* のインポートは避けてください)。

スレッド化は、奇妙なバグの潜在的な問題になることがよくあります。Swing コンポーネントは常に EDT で使用する必要があります (使用java.awt.EventQueue.invokeLater)。AWT はスレッドセーフですが、実際にはそうではありません。また、使用を EDT に制限してください。

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

すでに Java 1.4 が必要なので、代わりに SWING GUI を使用するためにいくつかの小さな変更を検討する必要があります。これにより、AWT でのアプレット更新の問題が解決されました。(Mac、Linux など)

例えば ​​Panel がある場合は、JPanel などに置き換える必要があります。

あなたはこれを必要とします:

import javax.swing.*;
于 2008-10-09T11:42:20.140 に答える