次に、互換性のない AWT 変更を示します:
requestFocus メソッドを使用します。例えば、MouseListener の中の mouseClicked メソッドをカスタムコンポーネント用に実装する場合、そのコンポーネントの requestFocus メソッドを起動する必要があります。java.awt.peer パッケージの次の 4 つの 1.02 メソッドは、1.1では除外されています: java.awt.peer.ComponentPeer:
public abstract boolean handleEvent(java.awt.Event);
public abstract void nextFocus();
java.awt.peer.ScrollbarPeer:
public abstract void setValue(int);
java.awt.peer.FramePeer:
public abstract void setCursor(int);
java.awt.peer パッケージの API は常に変更される可能性があります。
IllegalArgumentException となります。
Graphics の drawPolygon メソッドは、閉じない多角形を描画していました。 1.1 では、drawPolygon は自動的に多角形を閉じます。閉じない多角形を描画したい場合は、代わりに新しい drawPolyline メソッドを使用することができます。
Color クラスの構築子は、渡されるパラメータの範囲をチェックし、範囲外の値を見つけた場合、IllegalArgumentException をスローします。
Dialog 構築子に null フレームを渡すと、現在では IllegalArgumentException となります。
nextFocus は、 java.awt.peer.ComponentPeer インタフェースから除外されました。ピアインタフェースは AWT とその実装との間の private インタフェースであるため、これはアプリケーションやアプレットには影響しません。
handleEvent メソッドを持っている場合、プログラムの動作状態を見て変更点が分かるでしょう。Frame の handleEvent メソッドに次のフラグメントを持っている場合を示します:
if (event.id == Event.GOT_FOCUS) {
// do something...
}
Frame 内のコンポーネント (ボタンなど) がフォーカスを取得したとき、このブロックが呼び出されます。ブロックがこのようなケースを処理するように設計されていない場合、プログラムは 1.0.2 のときのように動作しない可能性があります。
新しい同期モデルでは、コンテナ内のコンポーネントの構造とレイアウトは、単一の AWT 全体ロックによって保護されています。これには、Component クラスで次のように宣言した Component.LOCK と呼ばれるオブジェクトが使用されます。
public static final Object LOCK = new Object();
例えば、Container.validate、
Container.add、
および Container.remove
には、Component.LOCK を使用する同期化ブロックがすべて含まれています。
Component.setEnabled または Button.setLabel などの個別コンポーネント状態に対する Setter メソッドは、インスタンス自身の上で同期化されます。 Getter メソッドは通常同期化されませんが、共有データのスレッドローカルコピーを作り、このメソッドで使用するというコピー貼り付け方式によって、半ば保護されています。
AWT を使用するコードについて、それが同期化コンテキストで起動された AWT メソッドをオーバーライドする間に自分自身のロックを獲得する場合、一定のロック順序に関する綿密な調査を行う必要があります。例えば、レイアウトコード内で自分のロックを獲得する場合、このコードが既に保持されている Component.LOCK ロックで呼び出されることを認識しておく必要があります。他のスレッドのコードがロックを保持し、 validate を起動しようとする場合、プログラムがデッドロックする可能性があります。このようなケースを識別したとき、一定のロック順序を保証するために、可能なところでコードを書き直す必要があります。この順序は通常クライアントロックを最初にし、次に Component.LOCK がきます。