Ich habe 600 Seiten in einen Java-Text und habe etwas Verwirrendes erlebt.Java Lambda Expressions und Event-Info
Im Abschnitt über die Swing-Programmierung werden drei verschiedene Möglichkeiten zum Erstellen eines "EventListener" zum Verarbeiten von Schaltflächenklicks angezeigt. Zuerst wird gezeigt, wie man eine Funktion in einer Klasse verwendet, die ActionListener
implementiert, dann wie man eine verschachtelte Klasse verwendet, die ActionListener
implementiert, und schließlich wie man einen Lambda-Ausdruck verwendet.
Die ersten beiden Methoden verwenden, um eine im Wesentlichen identische Funktion (Kommentare sind mir):
…
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
}
}
Das ist ziemlich einfach ist; Eine Schaltfläche wird erstellt, und entweder das Schaltflächenobjekt selbst oder eine separate Klasse mit einer Funktion wird an addActionListener
übergeben, um der Schaltfläche einen Ereignishandler hinzuzufügen.
Das Lambda Expression verwendet eine etwas abgespeckte Funktion, die täuschend ähnlich sieht:
…
button1 = new JButton("foobar"); //create a button
button1.addActionListener(e -> button1Click()); //set button1Click as event handler
…
public void button1Click() { //event handler
//do something
}
Was ich verwirrt, ist der Mangel an Ereignisinfo. In den ersten beiden Methoden müssen die Funktionen die Ereignisquelle überprüfen, um zu sehen, ob es die Schaltfläche ist, aber der Lambda-Ausdruck geht davon aus/weiß, dass die Ereignisquelle die Schaltfläche ist. Wie?
Woher kommt das? Der Aufruf an addActionListener
beginnt mit button1
, aber es wird nirgends in der Lambda-Expression erwähnt. Bedeutet dies nicht, dass die Verwendung eines Lambda-Ausdrucks einschränkt, welche Informationen verfügbar sind? Es gibt keinen Hinweis auf e
in der Funktion, so hätte es keine Möglichkeit, die Funktionen für den Zugriff auf Dinge, um herauszufinden, wie der Schlüssel, Zeitstempel usw.
(Oh, und warum Java nennt es ein Ereignis Zuhörer anstelle eines Handler wie fast jede andere Sprache ist mir schleierhaft. und sie sagen, dass Java und JavaScript in Namen ähnlich sind nur ...)
Sie fügen die Lamba zu einem einzigen JButton hinzu, ähnlich wie in einer anonymen inneren Klasse. Wenn Sie dies tun, müssen Sie die Quelle der Schaltfläche nicht überprüfen. Wenn Sie andererseits ein Lambda erstellt und dasselbe einzelne Lambda in mehrere Schaltflächen übertragen haben, dann möchten Sie das ActionEvent hier in die Methode button1Click übergeben: –
'e -> button1Click (e)'. Dann würde die button1Click-Methode natürlich einen ActionEvent-Parameter erfordern, und Sie könnten 'getSource()' darauf aufrufen. –