2017-02-10 13 views
0

グローバルキーイベントを追跡しようとしています。特に、矢印キーが押されています。このために、私は、現在アクティブなシーンにハンドラをアタッチしています:文字、Ctrlキーやタブなどのほとんどのキーは常に検出されている間、どの要素がフォーカスを持っていないながらノードにフォーカスがある場合、特定のキーイベントがシーンに到達しない

scene.setOnKeyPressed(event -> 
     System.out.println("KEY PRESSED: " + event.getCode()) 
) 

ただし、スペースと矢印キーはのみ動作します。つまり、ウィンドウ内のどこかをクリックするだけで、要素の一部がフォーカスされ、スペースや矢印を押してもイベントが発生しなくなります。 CSSのスタイリングを通して、シーンがクリックされると常にフォーカスされた要素が存在し、上記のキーはこの場合には機能しなくなることが分かりました。

私の推測では、フォーカスされたノードはキーイベントを聞いて、スペースや矢印の場合はそれらをバブリングすることを拒否します。私の質問は次のとおりです:

  1. これらのキーはなぜキャプチャされていますか?私は任意のUIコンポーネントが常に矢印とスペースのキーイベントを処理する必要はないと考えています。
  2. ノードがキーイベントを盗んでしまうのを防ぐことができます。そうでない場合、キー押下を検出する別の方法がありますか?
+1

シーンにイベントフィルタを追加するだけで、キープレスイベントがスクロールペインで消費される前にキャプチャされます。 –

答えて

1

イベントは個別にフォーカスされたノードでは取得されませんでしたが、それらのすべてをラップするのはScrollPaneです。必要に応じてこれらのキーをキャプチャしてビューポートをスクロールし、スクロールが不可能な場合でもビューポートをバブルしません。

this answerで説明したように、ScrollPane#addEventFilterを使用してこの動作を変更することはできますが、使い勝手に悪影響を及ぼさないように注意する必要があります。

その意味では、矢印とスペースをデフォルトの動作(スクロール)にして別のキーに切り替えるほうが良いでしょう。

関連する問題