Java / Swing では、重要なイベントを処理する方法が少なくとも 2 つあります。
それぞれの長所と短所は何ですか? また、いつどちらを優先するべきですか?
どちらか一方を優先するのはいつですか?
導入されて以来、キー バインドを優先します。AKeyListener
は、イベントとの下位レベルの接続です。
キーバインディングのそのページは、KeyListener
. 単に「利用できない」多くのものがリストされていますKeyListener
。EG の選択肢:
WHEN_FOCUSED
WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
WHEN_IN_FOCUSED_WINDOW
リンクされたドキュメントを読めば読むほど、質問する必要性が理解できなくなります。例えば:
キー バインドの代わりに、キー リスナーを使用します。キー リスナーは、キーボード入力への低レベル インターフェイスとしての役割を果たしますが、個々のキーに応答するには、キー バインディングの方が適切であり、コードの保守が容易になる傾向があります。コンポーネントにフォーカスがないときにキーバインディングがアクティブになる場合、キーリスナーも困難です。キーバインディングの利点のいくつかは、自己文書化されていること、包含階層を考慮していること、再利用可能なコードのチャンク (
Action
オブジェクト) を奨励していること、およびアクションを簡単に削除、カスタマイズ、または共有できることです。また、アクションがバインドされているキーを簡単に変更できます。のもう一つの利点Actions
それは、アクションがどのコンポーネントにアタッチされているかを追跡することなく、アクションを簡単に無効にする方法を提供する有効な状態を持っていることです。
@Robin が指摘したように、テキスト コンポーネントにはDocumentListener
&もDocumentFilter
あり、テキスト ドキュメントにより適した機能を追加できます。ドキュメントリスナーとフィルターの詳細については、テキスト コンポーネントの機能を参照してください。
利点
設定可能、共有可能、
un_want な副作用のない単純なショートカット用に設計されています (これらのイベントのほとんどは非常に単純で設定可能です)。
ウィンドウのフォーカスに関する問題を快適に解決します(設定可能でもあり、Javaではウィンドウが画面にフォーカスしている必要があります)
@camickr による Key Bindingsで KeyBindings、built_in ショートカット、アクションなどを使用するために内部で Swing (Swing では興味深いショートカットとアクションが実装されています)
出力は Swing アクションにある必要があります (Swing で可能な限り高い抽象化と同じ)
短所
キーボードからすべてのキーをオーバーライドすることはできません
無効にすることはできません 3 つ以上のキーが同時に押されました
コードは非常に複雑に見えます (まったくそうではありません。ほとんどの場合、コードは KeyListener からの同じコードと比較してソーターです)
詳細については @camickr によるコメントを参照するために削除されました(繰り返しのアクションには Swing Timer が必要です)
API に実装された 1 つのメソッドで consumer() を実行することはできません
.
KeyListeners (低レベルのリスナー)
利点
非常に使いやすく、直感的
1 つの 2 つの重要なイベントのコードは非常に短い
Swing、Javaに関する知識は必要ありません
ツリーをオーバーライドするか、複数のキーが押された場合 (例)、非常に複雑なキーショートカットの場合、どのキー イベントを個別に起動できるかは問題ではありません。
プログラムで event.consume() にすることが可能です
複合 JComponents (JComboBox、JSpinner ...) からの non_finalized 内部イベントをリッスンすることが可能です。
短所
コンテナと JComponents の一部にアクセスできない
(J) コンポーネントはフォーカス所有者であり、フォーカス可能でなければなりません
Swing JComponents には指定されていません
.
AWTEventListener
すべての Key および Mouse イベントを結合するには、Java で可能な低レベルのリスナーを使用します。
基本的に、Swing に基づくほとんどの (非常に複雑な) GUI でこのリスナーを使用する理由はありません。
このリスナーは、ネイティブ OS に由来する AWT に必要なピアに基づいてカスタム コンポーネントに実装されています。
しかし、@camickr による AWTEventListener Application Inactivity および Global Event Listeners の優れた実装があります。
.
注意: キーイベントの順序はプラットフォームごとに異なります