这应该是一个基本的Java程序,可供初学者使用 关于ActionListener接口主题的“Head First Java 2nd Edition”。
我不理解这个程序中使用的一些术语,例如
button.addActionListener(this);
当此代码执行时,如何触发或运行方法actionPerformed或 你使用的任何术语??
//Program begins from now!!
import javax.swing.*;
import java.awt.event.*;
public class SimpleGui1B implements ActionListener {
JButton button;
public static void main(String[] args) {
SimpleGui1B gui = new SimpleGui1B();
gui.go();
}
public void go(){ //start go
JFrame frame= new JFrame();
button=new JButton("Click me");
frame.getContentPane().add(button);
button.addActionListener(this);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300,300);
frame.setVisible(true);
}//close go()
public void actionPerformed(ActionEvent event){
button.setText("I’ve been clicked!");
}
}
答案 0 :(得分:1)
在JButton类中,处理键盘和鼠标事件,一旦按钮检测到单击,它就会迭代到其动作侦听器并调用它们:
ActionEvent event = new ActionEvent(...);
for (ActionListener listener : addedListeners) {
listener.actionPerformed(event);
}
监听器只是回调对象。
答案 1 :(得分:1)
让我们分解这句话:
button.addActionListener(this);
好的,所以你引用了button
对象。这是我认为的JButton
类型的对象。 button
对象有一个名为addActionListener
的方法。这样做,是添加一个实现ActionListener
接口的对象。
发生这种情况的类是其中一个对象。正如你在顶部看到的那样:
public class SimpleGui1B implements ActionListener
所以程序正在做的是说当前的类(this
)将作为方法的参数。然后,如果您查看此课程,则可以使用方法actionPerformed
。
public void actionPerformed(ActionEvent event){
button.setText("I’ve been clicked!");
}
这意味着只要单击按钮,就会调用actionPerformed
方法中的代码。另一种选择是:
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
// Add some code here.
}
这是完全相同的事情,只是它在括号内定义了类。
答案 2 :(得分:1)
让我们来看看代码:
在javax.swing.AbstractButton
中有一个名为addActionListener
的方法,其代码为:
public void addActionListener(ActionListener l) {
listenerList.add(ActionListener.class, l);
}
listenerList
在javax.swing.JComponent
中定义为:
protected EventListenerList listenerList = new EventListenerList();
当javax.swing.AbstractButton中的事件发生时fireActionPerformed
被调用。代码如下:
protected void fireActionPerformed(ActionEvent event) {
// Guaranteed to return a non-null array
Object[] listeners = listenerList.getListenerList();
ActionEvent e = null;
// Process the listeners last to first, notifying
// those that are interested in this event
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i]==ActionListener.class) {
// Lazily create the event:
if (e == null) {
String actionCommand = event.getActionCommand();
if(actionCommand == null) {
actionCommand = getActionCommand();
}
e = new ActionEvent(AbstractButton.this,
ActionEvent.ACTION_PERFORMED,
actionCommand,
event.getWhen(),
event.getModifiers());
}
((ActionListener)listeners[i+1]).actionPerformed(e);
}
}
}
最重要的部分是最后一行:
((ActionListener)listeners[i+1]).actionPerformed(e);
这是调用actionPerformed()
方法
答案 3 :(得分:0)
这意味着调用此代码的类是按钮更改的侦听器。因此该按钮将在此特定类上调用“actionPerformed”。
答案 4 :(得分:0)
button.addActionListener(this);
告诉button
this
只要点击按钮就想知道。从那时起,只要点击按钮,它就会浏览已注册的ActionListener
列表,并在每个按钮上调用actionPerformed
方法。
答案 5 :(得分:0)
代码是什么
button.addActionListener(this);
确实是添加您的类(使用关键字this
)作为您创建的按钮的动作侦听器。
这意味着,只要发生一个动作(例如点击),按钮就会调用你的类。这就是你需要方法
public void actionPerformed(ActionEvent event){
button.setText("I’ve been clicked!");
}
因为它会被按钮调用
答案 6 :(得分:0)
基本上你是通过观察者模式来观察者用subject来注册自己。现在只要这是主题上的一些事件触发器,主题就会通知不同的观察者。这里Button是主题,而SimpleGui1B(基本上是监听器)是观察者。现在让我们来看你的代码片段
button.addActionListener(this);
在上面一行中,按钮是主题,这是听众/观察者。 JButton设计了一种方式,只要某个事件(在这种情况下单击)发生在按钮上,观察者就会通过方法actionPerformed通知