我有以下代码:
JButton button = new JButton("Clear");
button.addActionListener(this);
据我所知,我创建了一个按钮,上面写着“清除”。然后我必须将一个动作与此按钮相关联(如果按下该按钮会发生什么)并且由addActionListener
完成。是不是?
但我不明白的是指定了行动的地方。按下按钮应该清除文本区域,据我所知,应该有一个代码清除文本区域。但在给定的示例中, addActionListener()
的参数中只有“this”。
程序如何知道按下按钮时应该清除文本区域?
如果需要,则会给出完整代码here。
答案 0 :(得分:16)
ActionListener
是一种回调机制。每当添加一个控件来触发ActionEvent
时,都会调用public void actionPerformed(ActionEvent e)
方法。
我不明白的是调用actionPerformed的位置。我看到它是在类中定义的,但没有调用此方法的地方。
这是由UI组件的内部机制调用的。从概念上讲,您可以将代码看起来像这样:
public class Button {
private final List<ActionListener> listeners = new ArrayList<ActionListener>();
public void addActionListener(ActionListener l) {
listeners.add(l);
}
public void click() {
ActionEvent event = new ActionEvent(this, 0, "click");
for (ActionListener l : listeners) {
l.actionPerformed(event);
}
}
}
答案 1 :(得分:2)
每个JButton
都有一个EventListenerList
。调用addActionListener(this)
会将您的ActionListener
(一个名为actionPerformed()
的回调函数)添加到列表中。您可以看到调用方法here的代码大纲。实际的fireActionPerformed()
方法位于AbstractButton
。 JButton
是JComponent
,您可以在使用事件侦听器列表机制的各个类中see listed。
答案 2 :(得分:1)
您致电button.addActionListener( this )
,因为this
实施了接口ActionListener
。单击该按钮时,将调用方法actionPerformed(ActionEvent e)
(由接口定义并由您的类实现)。
答案 3 :(得分:0)
事件生成器被告知可以处理其事件的对象 事件生成器有一个方法; - addActionListener(对Handler类对象的引用) 例如,
JButton b1=new JButton("My Button");
b1.addActionListener(this); // Please note listener and generator are same class
由于事件处理程序位于包含的同一对象中
按钮,因此我们必须使用this
来传递参考。
答案 4 :(得分:0)
基本上,UI事件处理的机制是JVM队列事件,每种类型的事件都有其订阅者。触发事件时,如单击按钮,JVM将相应地将处理委派给事件的订户。此订阅者类必须定义方法或事件处理程序来处理事件。
在你的情况下,在打电话时 button.addActionListener(本); 代码实际上将此KeyEventDemo实例订阅到click类型的事件。然后,当单击该按钮时,将触发KeyEventDemo的actionPerformed方法。