「アクション」オブジェクトを複数のコンポーネントに登録することについて読んでいて、アクションオブジェクトをキーストロークオブジェクトに登録 (バインド) するレシピに出会いました。
追求の中で、私はこのコードに出くわしました:
InputMap imap = panel.getInputMap(JComponent.WHEN_FOCUSED);
imap.put(KeyStroke.getKeyStroke("ctrl Y"), "panel.yellow");
ActionMap amap = panel.getActionMap();
amap.put("panel.yellow", yellowAction)
これが機能する方法は、キーストロークを Action オブジェクトに登録するための 1 つのレベルの間接性があることです。最初に、キーストロークをコンポーネントの入力マップ (この例では、WHEN_FOCUSED 定数に対応するマップ) のいずれかの任意のオブジェクトに関連付けます。次に、別のマップ (ActionMap) で同じ参照を使用してアクションを登録します。成分。
キーストロークをアクションオブジェクトにマッピングするセマンティクスが、これら2つのマップに存在する中間オブジェクト参照の類似性を使用して行われると仮定すると、オブジェクトが私が使用した参照は、実際に有効な等価概念 (またはハッシュコード) を定義しています。
たとえば、私の例では、InputMaps の 1 つで文字列 "panel.yellow" のインスタンスを使用してキーストロークをアタッチしています。次に、Panel の ActionMap で同じ文字列 "panel.yellow" を使用してアクション オブジェクトをアタッチしようとしています。 . さて、理論的には、JVM はこれらの両方の String インスタンス (私がハードコーディングしたもの) が同じ String オブジェクトを参照することを保証しません! さらに悪いことに、JVM が文字列のコンテンツの等価性の概念を提供しない場合、アクション オブジェクトをキーストロークに正常にマップする方法はありません。これは、キーストロークをアクション オブジェクトに中間的にバインドするために使用する可能性があり、オブジェクト クラスが定義する参照の等価性以外の等価性 (またはハッシュコード) の概念を定義していないオブジェクトにも当てはまります。
誰でもこれを明確にしてください。
AVID