私はJavaのテキストに600ページあり、混乱しています。Java Lambda式とイベント情報
Swingプログラミングのセクションでは、ボタンクリックを処理するための "EventListener"を作成する3つの異なる方法を示します。まず、ActionListener
を実装するクラスで関数を使用する方法、次にActionListener
を実装するネストされたクラスを使用する方法、最後にラムダ式を使用する方法を示します。
最初の2つの方法は、本質的に同一の機能(コメントは私です)を使用します。
…
button1=new JButton("foobar"); //create a button object
button1.addActionListener(this); //add an event handler to it
…
public void actionPerformed(ActionEvent e) { //event handler (standalone or in a class)
if (e.getSource() == button1) { //check if event source is the button
//do something
}
}
非常に簡単です。ボタンが作成され、ボタンオブジェクト自体、または関数を含む別のクラスがaddActionListener
に渡され、イベントハンドラがボタンに追加されます。
ラムダ式は一見似ているわずかストリップダウン機能使用しています。私を混乱させる何
…
button1 = new JButton("foobar"); //create a button
button1.addActionListener(e -> button1Click()); //set button1Click as event handler
…
public void button1Click() { //event handler
//do something
}
をイベント情報の欠如です。最初の2つのメソッドでは、関数がボタンであるかどうかを確認するためにイベントソースをチェックする必要がありますが、ラムダ式はイベントソースがボタンであることを前提としています。どうやって?
これはどこですか? addActionListener
の呼び出しはbutton1
で始まりますが、ラムダ式のどこにも記載されていません。また、ラムダ式を使用すると利用可能な情報が制限されているわけではありませんか?それはキーのようなものを見つけるための機能にアクセスする方法はありませんので、関数内e
への参照は、タイムスタンプが
等、、、存在しない(ああ、なぜJavaがイベントを呼び出しますリスナーの代わりに、ほぼすべての他の言語のようハンドラは私を超えている。そして、彼らは非ラムダ例に渡されたリスナーがthis
であることを
匿名の内部クラスを渡すのと同じように、1つのJButtonにのみlambaを追加します。これを行うときに、ボタンのソースを確認する必要はありません。一方、ラムダを作成し、この単一のラムダを複数のボタンに渡した場合、ActionEvent(ここではe)をbutton1Clickメソッドに渡したいとします。 –
e-> button1Click(e) '。次に、button1ClickメソッドはもちろんActionEventパラメータを必要とし、その上で 'getSource()'を呼び出すことができます。 –