我在Java文本中有600页,并且遇到了令人困惑的事情。
在Swing编程一节中,它显示了三种不同的方法来创建“EventListener”来处理按钮点击。首先,它展示了如何在实现ActionListener
的类中使用函数,然后如何使用实现ActionListener
的嵌套类,以及如何使用Lambda表达式。
前两种方法使用基本相同的函数(注释是我的):
…
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
,以向该按钮添加事件处理程序。
Lambda Expression使用一个看似简单相似的略微剥离的函数:
…
button1 = new JButton("foobar"); //create a button
button1.addActionListener(e -> button1Click()); //set button1Click as event handler
…
public void button1Click() { //event handler
//do something
}
令我困惑的是缺少活动信息。在前两个方法中,函数必须检查事件源以查看它是否是按钮,但Lambda Expression只假定/知道事件源是按钮。怎么样?
它从哪里来的?对addActionListener
的调用以button1
开头,但在Lambda Expression中没有提及。此外,这是否意味着使用Lambda Expression限制了可用的信息?函数中没有e
的引用,因此它无法访问函数来查找键,时间戳等内容。
(哦,为什么Java称之为事件 listener 而非处理程序,几乎所有其他语言都超出我的范围。他们说Java和JavaScript是相似的仅在名义上......)
答案 0 :(得分:1)
请注意,传入非lambda案例的侦听器是this
,即设置按钮的对象。据推测,该对象(某个控制器或容器)可能充当多个按钮的事件监听器,因此必须区分哪个发送事件。另一方面,lambda正在创建一个仅关闭单个按钮的一次性处理程序实例,因此没有歧义。
答案 1 :(得分:1)
你提到了缺乏事件信息"在lambda表达式中。 Lambda表达式中的事件信息 - 它只是没有像在另一个例子中那样被使用。
此上下文中的表达式
e -> button1Click()
是
的简写(ActionEvent e) -> buttonClick()
因此您可以看到e
是事件信息。
另一方面,如果缺少事件信息",你的意思是"没有使用事件信息",答案是,你是对的,这似乎是错的。这两种方法是等价的,所以要比较苹果和苹果,要么都不应该检查来源,要么两者都应该。