Java中的事件和监听器

时间:2013-05-03 15:48:19

标签: java swing oop jbutton actionlistener

这应该是一个基本的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!");

    }


}

7 个答案:

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

listenerListjavax.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通知