2017-03-31 17 views
1

私はJavaやC#のようなOOP言語でかなり経験があります。今までFXに迷惑をかけずに、オフィスの退屈なイベントを処理することで周りを歩き始める。JavaFXイベント処理ミステリー - コードが削除され、イベントがまだ処理されていますか?

My FXアプリケーションはすべて1つのクラスで作成されています。私はこれらの2を含め、私が望んでいたパッケージを、輸入:

import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 

私はそうのような私のメインクラス宣言で型のActionEventでEventHandlerのインターフェイスを実装し...

public class Main extends Application implements EventHandler<ActionEvent> 

私は上の匿名の内部クラスを書きましたボタンオブジェクトは、それは明らかにそれが必要のように働いたが、その後、私は実験を実行した

btnButton.setOnAction(new EventHandler<ActionEvent>(){ 
     public void handle(ActionEvent event) { 
      System.out.println("I got clicked"); 
     } 
}); 

...そうのようにクリックイベントを処理します。私は上記の2つの輸入品を削除しました。 Mainクラス宣言の「実装」部分を削除しました。これは、イベント処理への参照なしに私のアプリケーションを残します。その後、ボタンオブジェクトに戻って、イベントハンドラをラムダ式として書きました...

btnButton.setOnAction(e -> System.out.println("I got touched")); 

これは何ですか?それはまだ働いた!これは不可能です..イベントを処理するために必要なコードを削除した後、これがどのように機能するのか誰かが説明できますか?それは一種の面白いと私の心を吹いている。

返信いただきありがとうございます!

-KeplerIO

+0

:ここでは関係セクションがありますlambdaexpressions.html)、ラムダ式は既定のJava 8ライブラリとは別のものであり、多くの宗教を自動的に処理する方法を完全に理解しています。これにはボタンアクションが含まれます。 – Sedrick

答えて

2

あなたがイベント処理のために必要なコードを削除しませんでした:

Mainクラスで EventHandler<ActionEvent>を実装
public class Main extends Application implements EventHandler<ActionEvent> 

が必要とされなかった、あなたはとにかくイベントハンドラとしてanonymusクラスを使用していたことから、代わりに

btnButton.setOnAction(this); 
番目 this参照を仮定し

(のe Mainインスタンス)

また、ラムダの利点の1つは、Javaコンパイラが実装しているインタフェースを決定できれば(つまり、メソッド)を明確に示します。 setOnActionメソッドがオーバーロードされていない。この場合、パラメータは、タイプEventHandler<ActionEvent>であり、実装するメソッドのシグネチャは、したがって

public void handle(ActionEvent event) 

btnButton.setOnAction((ActionEvent e) -> System.out.println("I got touched")); 

であることを確認することができ、Javaコンパイラで

偶数

btnButton.setOnAction(e -> System.out.println("I got touched")); 

"sati sfies "コンパイラ。


setOnAction方法は、コンパイラが使用する方法を決定するために、追加の情報を必要とする。この場合

public void setOnAction(Consumer<Integer> x) { ... } 

Buttonをオーバーロードされた場合、これは、異なるであろう。

btnButton.setOnAction((Integer a) -> System.out.println("something")); 
btnButton.setOnAction((ActionEvent a) -> System.out.println("something")); 
btnButton.setOnAction((Consumer<Integer>) a -> System.out.println("something")); 
btnButton.setOnAction((EventHandler<ActionEvent>) a -> System.out.println("something")); 

仕様でこれを調べることに興味がある場合は、私は[ここ](https://docs.oracle.com/javase/tutorial/java/javaOO/から理解することができるものから、

+0

回答者のおかげで!私は私の質問でそれを明確にしていないかもしれませんが、私は主なクラスラインからの "実装"ステートメントとインポートを削除しました。しかし、あなたの答えから、私はそれを収集することができます.setOnActionは自動的に私たちのために考えているすべてを行い、それはイベントがまだ処理された方法です!私は今より良く理解しています。ありがとう、友達! – KeplerIO

関連する問題