JTextComponent
にundo/redo(Ctrl-Z、Ctrl-Y)などのアクセラレータを追加しますが、にアクションとそのショートカットコマンドを表示したい場合は、KeyStroke
+ AbstractAction
に:両方の成分を含むフレームのJMenu
にスイングアクセラレータ:入力マップまたはメニュー?
- 成分の
InputMap
、 - 、
- ?
この場合、どのようなパターンが推奨されますか?
JTextComponent
にundo/redo(Ctrl-Z、Ctrl-Y)などのアクセラレータを追加しますが、にアクションとそのショートカットコマンドを表示したい場合は、KeyStroke
+ AbstractAction
に:両方の成分を含むフレームのJMenu
にスイングアクセラレータ:入力マップまたはメニュー?
InputMap
、この場合、どのようなパターンが推奨されますか?
アクセラレータでInputMapを使用するのは適切なのですか?
メニューの仕組みは、自動的にInputMap/ActionMapにバインディングを追加することです。したがって、メニューにそれを文書化したい場合は、それをメニューに追加するだけで、コンポーネントへの手動マッピングは行いません。
コンポーネントにKeyBindingを追加する場合は、コンポーネントごとに異なるアクションが必要な場合があります。たとえば、テキストコンポーネントに「コピー」、「貼り付け」のメニュー項目を作成することができます。しかし、JTableのような他のコンポーネントもコピーと貼り付けをサポートしています。この場合、同じアクセラレータで2つのメニュー項目を持つことはできませんので、テーブルアクションをテーブルに直接バインドします。
あなたの説明が示すように両方をしたいのであれば、両方を実行します。これは正常です。
ただし、アンドゥ/リドゥがフレーム上の複数のコンポーネントのうちの1つのコンポーネントにのみ適用される場合は、フレームのメニューに追加することを推奨しません。 (おそらくコンポーネントにJPopupMenu
を作成することもできます)。
しかし両方を実行すると、inputMapのアクションだけがトリガーされ、メニューは表示されません。それは私にはうまく見えません。それは私ですか?私はそれがメニューに表示したいと思って、私はちょうどinputMapを削除する必要があります。 – krookedking
私はメニューと入力マップの両方に同じアクションを与えます。 – jzd
[OK]をクリックしても、アクションはメニューによってトリガーされません。ユーザは、「ブラフ」です。彼はメニュー項目を呼び出していると考えていますが、代わりにinputMapのアクションを呼び出しています(実際は同じActionオブジェクトですが...)。多分それは私だけです。 – krookedking
純粋にユーザーの立場から:私はメニュー(またはコンテキストメニュー)でショートカットを見ることをお勧めします。
もちろん、私はあなたに同意します。しかし、アクセラレータでInputMapを使用するのが適切なのはいつですか? – krookedking
これは面白いです、私はすべてがInputMap/ActionMapを通過したことを知らなかったです。メニューがどのようにこれらの地図に影響するかを説明するリンクがありますか(私はJFrameだと思います)?ありがとうございました。 – krookedking
一般的な情報は、キー・バインディング(http://download.oracle.com/javase/tutorial/uiswing/misc/keybinding.html)を参照してください。詳細については、ソースコードを参照する必要があります。 BasicMenuItemUIにある "updateAcceleratorBinding()"メソッドを確認してください。メニュー項目の "WHEN_IN_FOCUSED_WINDOW" InputMapが使用されます。 – camickr
フォーカスされたコンポーネントをチェックし、フォーカスされたコンポーネントのタイプに応じて2つの異なるアクションに分岐する単一のメニュー項目を持つことができます。 –