2

「アクション」オブジェクトを複数のコンポーネントに登録することについて読んでいて、アクションオブジェクトをキーストロークオブジェクトに登録 (バインド) するレシピに出会いました。

追求の中で、私はこのコードに出くわしました:

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

4

2 に答える 2

1

両方の文字列が同じオブジェクトではない可能性があることは間違いありませんが、equals(...)アクションをキーストロークにマップするために使用される可能性が高いメソッドを使用して、等しいかどうかを確認できます。

すべてのオブジェクトに加えて、任意のオブジェクトの場合と同じである可能性があるメソッドhashCodeも提供しますが、コンテンツの同等性チェックのためにそれをオーバーライドすることに注意してください(カスタムオブジェクトに対してそのメソッドをオーバーライドする場合も同様です)。equals(...)==String

于 2011-04-22T09:03:01.900 に答える
1

文字列はデフォルトでインターンされるため、同じオブジェクトになります。詳細については、String.intern()メソッドを参照してください。

しかし、これについて本当に心配している場合、簡単な解決策は、InputMapとActionMapで同じオブジェクト参照を使用することです。

これを行う方法を示すKeyBindingsのサンプルコードを確認してください。

于 2011-04-22T14:58:59.787 に答える