1

这应该是初学者可以在“Head First Java 2nd Edition”上找到关于 ActionListener 接口主题的一个基本 Java 程序。

我不明白这个程序中使用的一些术语,例如

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!");

    }


}
4

7 回答 7

2

让我们分解一下这个陈述:

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.
      }

这是在做完全相同的事情,只是它在括号内定义了类。

于 2013-05-03T15:55:46.410 回答
2

在 JButton 类中,键盘和鼠标事件被处理,一旦按钮检测到点击,它就会迭代到它的动作监听器并调用它们:

ActionEvent event = new ActionEvent(...);
for (ActionListener listener : addedListeners) {
    listener.actionPerformed(event);
}

侦听器只是回调对象。

于 2013-05-03T15:53:56.523 回答
1

Let's walk through the code:

In javax.swing.AbstractButton there is a method called addActionListener where the code is:

public void addActionListener(ActionListener l) {
  listenerList.add(ActionListener.class, l);
}

listenerList is defined in javax.swing.JComponent as:

protected EventListenerList listenerList = new EventListenerList();

When an event occurs fireActionPerformed in javax.swing.AbstractButton is called. The code looks like:

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);
    }
  }
}

The most important part is the last line that says:

((ActionListener)listeners[i+1]).actionPerformed(e);

This is the line of code that calls your actionPerformed() method

于 2013-05-03T16:00:39.170 回答
0

基本上,您将通过观察者模式,观察者将自己注册到主题。现在,只要这是主题上的一些事件触发,主题就会通知不同的观察者。这里 Button 是主题,SimpleGui1B(基本上是侦听器)是观察者。现在让我们来看您的代码片段

 button.addActionListener(this);

在上面的行中,按钮是主题,这是侦听器/观察者。JButton 以某种方式设计,每当按钮上发生某​​些事件(在本例中为单击)时,将通过 actionPerformed 方法通知观察者

于 2013-05-03T15:57:21.817 回答
0

这意味着调用此代码的类是按钮更改的侦听器。所以那个按钮会在这个特定的类上调用“actionPerformed”。

于 2013-05-03T15:51:37.660 回答
0

button.addActionListener(this);告诉想要知道何时单击按钮buttonthis从那时起,每当单击按钮时,它将遍历其已注册ActionListener的列表并调用actionPerformed每个按钮的方法。

于 2013-05-03T15:53:25.077 回答
0

什么代码

button.addActionListener(this);

所做的是将您的类(使用关键字this)添加为您创建的按钮的动作侦听器。这意味着,只要发生操作(例如单击),按钮就会调用您的类。这就是您需要该方法的原因

public void actionPerformed(ActionEvent event){
   button.setText("I’ve been clicked!");
}

因为它会被按钮调用

于 2013-05-03T15:53:44.797 回答