Javafx-event-handling
JavaFX-イベント処理
JavaFXでは、GUIアプリケーション、Webアプリケーション、およびグラフィカルアプリケーションを開発できます。 このようなアプリケーションでは、ユーザーがアプリケーション(ノード)と対話するたびに、イベントが発生したと言われます。
たとえば、ボタンをクリックする、マウスを動かす、キーボードから文字を入力する、リストから項目を選択する、ページをスクロールするなどのイベントが発生します。
イベントの種類
イベントは大きく次の2つのカテゴリに分類することができます-
- フォアグラウンドイベント-ユーザーの直接的な対話を必要とするイベント。 これらは、グラフィカルユーザーインターフェイスのグラフィカルコンポーネントと対話する人の結果として生成されます。 たとえば、ボタンをクリックする、マウスを動かす、キーボードから文字を入力する、リストから項目を選択する、ページをスクロールするなど
- バックグラウンドイベント-エンドユーザーの相互作用を必要とするイベントは、バックグラウンドイベントとして知られています。 バックグラウンドイベントの例は、オペレーティングシステムの中断、ハードウェアまたはソフトウェアの障害、タイマーの期限切れ、操作の完了です。
JavaFXのイベント
JavaFXは、さまざまなイベントを処理するためのサポートを提供します。 パッケージ javafx.event の Event というクラスは、イベントの基本クラスです。
そのサブクラスのインスタンスはイベントです。 JavaFXは、さまざまなイベントを提供します。 それらの一部を以下にリストします。
- マウスイベント-これは、マウスがクリックされたときに発生する入力イベントです。 MouseEvent という名前のクラスで表されます。 これには、マウスクリック、マウス押下、マウスリリース、マウス移動、マウス入力ターゲット、マウス終了ターゲットなどのアクションが含まれます。
- キーイベント-これは、ノードでキーストロークが発生したことを示す入力イベントです。 KeyEvent という名前のクラスで表されます。 このイベントには、キーの押下、キーのリリース、キーの入力などのアクションが含まれます。
- ドラッグイベント-これは、マウスがドラッグされたときに発生する入力イベントです。 DragEvent という名前のクラスで表されます。 入力されたドラッグ、ドロップされたドラッグ、入力されたターゲットのドラッグ、終了したターゲットのドラッグ、上にドラッグなどのアクションが含まれます
- ウィンドウイベント-これは、ウィンドウの表示/非表示アクションに関連するイベントです。 WindowEvent という名前のクラスで表されます。 ウィンドウの非表示、ウィンドウの表示、ウィンドウの非表示、ウィンドウの表示などのアクションが含まれます。
イベント処理
イベント処理は、イベントを制御し、イベントが発生した場合に何をすべきかを決定するメカニズムです。 このメカニズムには、イベントが発生したときに実行されるイベントハンドラーと呼ばれるコードがあります。
JavaFXは、イベントを処理するハンドラーとフィルターを提供します。 JavaFXでは、すべてのイベントに-
- ターゲット-イベントが発生したノード。 ターゲットは、ウィンドウ、シーン、およびノードです。
- ソース-イベントが生成されるソースは、イベントのソースになります。 上記のシナリオでは、マウスがイベントのソースです。
- Type -発生したイベントのタイプ。マウスイベントの場合–マウスが押された状態、マウスが離された状態がイベントのタイプです。
次のようにグループオブジェクトを使用して、サークル、停止、再生ボタンが挿入されたアプリケーションがあると仮定します-
再生ボタンをクリックすると、ソースはマウスになり、ターゲットノードは再生ボタンになり、生成されるイベントのタイプはマウスクリックになります。
JavaFXでのイベント処理のフェーズ
イベントが生成されるたびに、JavaFXは次のフェーズを経ます。
ルート建設
イベントが生成されるたびに、イベントのデフォルト/初期ルートは*イベントディスパッチチェーン*の構築によって決定されます。 ステージからソースノードへのパスです。
上記のシナリオで再生ボタンをクリックしたときに生成されるイベントのイベントディスパッチチェーンを次に示します。
イベントキャプチャフェーズ
イベントディスパッチチェーンの構築後、アプリケーションのルートノードがイベントをディスパッチします。 このイベントは、ディスパッチチェーン内のすべてのノード(上から下)に移動します。 これらのノードのいずれかに、生成されたイベントに対して filter が登録されている場合、実行されます。 ディスパッチチェーン内のどのノードにも生成されたイベントのフィルターがない場合、ターゲットノードに渡され、最終的にターゲットノードがイベントを処理します。
イベントバブリングフェーズ
イベントバブリングフェーズでは、イベントはターゲットノードからステージノードに移動します(下から上)。 イベントディスパッチチェーン内のノードのいずれかに、生成されたイベント用に登録された handler がある場合、実行されます。 これらのノードにイベントを処理するハンドラがない場合、イベントはルートノードに到達し、最終的にプロセスが完了します。
イベントハンドラーとフィルター
イベントフィルターとハンドラーは、イベントを処理するアプリケーションロジックを含むものです。 ノードは、複数のハンドラー/フィルターに登録できます。 親子ノードの場合、共通のフィルター/ハンドラーを親に提供できます。これは、すべての子ノードのデフォルトとして処理されます。
前述のように、イベント中の処理は実行されるフィルターであり、イベントバブリングフェーズ中はハンドラーが実行されます。 すべてのハンドラーとフィルターは、パッケージ javafx.event の EventHandler インターフェースを実装します。
イベントフィルターの追加と削除
イベントフィルターをノードに追加するには、 Node クラスの* addEventFilter()*メソッドを使用してこのフィルターを登録する必要があります。
同様に、以下に示すようにメソッドremoveEventFilter()を使用してフィルターを削除することができます-
イベント処理の例
以下は、イベントフィルターを使用したJavaFXでのイベント処理を示す例です。 このコードを EventFiltersExample.java という名前のファイルに保存します。
次のコマンドを使用して、コマンドプロンプトから保存したJavaファイルをコンパイルして実行します。
実行時に、上記のプログラムは以下に示すようにJavaFXウィンドウを生成します。
イベントハンドラーの追加と削除
ノードにイベントハンドラーを追加するには、以下に示すように、 Node クラスの* addEventHandler()*メソッドを使用してこのハンドラーを登録する必要があります。
同様に、以下に示すようにメソッドremoveEventHandler()を使用してイベントハンドラを削除することができます-
例
次のプログラムは、イベントハンドラーを使用したJavaFXでのイベント処理を示す例です。
このコードを EventHandlersExample.java という名前のファイルに保存します。
次のコマンドを使用して、コマンドプロンプトから保存したJavaファイルをコンパイルして実行します。
実行すると、上記のプログラムは、以下に示すようにテキストフィールドと3Dボックスを表示するJavaFXウィンドウを生成します-
ここで、テキストフィールドに文字を入力すると、3Dボックスがx軸に沿って回転し始めます。 もう一度ボックスをクリックすると、回転が停止します。
イベント処理に便利なメソッドを使用する
JavaFXの一部のクラスは、イベントハンドラープロパティを定義します。 それぞれのセッターメソッドを使用してこれらのプロパティに値を設定することにより、イベントハンドラーに登録できます。 これらのメソッドは、便利なメソッドとして知られています。
これらのメソッドのほとんどは、Node、Scene、Windowなどのクラスに存在し、それらのすべてのサブクラスで使用できます。
たとえば、マウスイベントリスナーをボタンに追加するには、以下に示すように便利なメソッド* setOnMouseClicked()*を使用できます。
例
次のプログラムは、便利なメソッドを使用したJavaFXでのイベント処理を示す例です。
このコードを ConvinienceMethodsExample.java という名前のファイルに保存します。
次のコマンドを使用して、コマンドプロンプトから保存したJavaファイルをコンパイルして実行します。
実行時に、上記のプログラムは以下に示すようにJavaFXウィンドウを生成します。 ここで、再生ボタンをクリックしてアニメーションを開始し、停止ボタンをクリックしてアニメーションを停止します。