addActionListener()监听器的问题

时间:2021-10-04 08:34:08

import java.awt.*;  
import java.awt.event.*;  
import javax.swing.*;  
      
public class OuterClassEvent extends JFrame{     
    public OuterClassEvent(){  
     setLayout(new FlowLayout());           
        JButton btn=new JButton("ok");
        add(btn);
        OuterClass btListener=new OuterClass();
        btn.addActionListener(btListener);  
    }    
    public static void main(String args[]){  
     OuterClassEvent frame = new OuterClassEvent();
        frame.setTitle("外部类作为事件监听器");
        frame.setLocationRelativeTo(null); // Center the frame
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(280, 100);
        frame.setVisible(true);
        new ThisClassEvent();  
    }  
}     
class OuterClass implements ActionListener{ 
    public void actionPerformed(ActionEvent e){  
     System.out.println("The OK button is clicked");
    }  


当btn.addActionListener(btListener)时为什么会输出The OK button is clicked
ActionListener接口明明要接受ActionEvent的引用.什么时候在那里传的

6 个解决方案

#1


ActionEvent指示发生了组件定义的动作的语义事件。当特定于组件的动作(比如被按下)发生时,由组件(比如 Button)生成此高级别事件。事件被传递给每一个 ActionListener 对象,这些对象是使用组件的 addActionListener 方法注册的,用以接收这类事件。 

实现 ActionListener 接口的对象在发生事件时获取此 ActionEvent。因此,侦听器不必处理个别鼠标移动和鼠标单击的细节,而是可以处理像“按下按钮”这样的“有意义”(语义)事件。 

#2


程序什么时候在那里调用了actionPerformed()方法的.

#3




import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class OuterClassEvent extends JFrame {
    
    JButton btn;//为了看清楚怎么回事,把局部变量改为成员变量
    public OuterClassEvent() {
setLayout(new FlowLayout());
btn = new JButton("ok");//为了看清楚怎么回事,把局部变量改为成员变量
add(btn);
/*
OuterClass btListener=new OuterClass();
btn.addActionListener(btListener);  
 */

//等价于

/*
 btn.addActionListener(new OuterClass());  
 */

//等价于

/*
btn.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
System.out.println("The OK button is clicked");
    }
});
*/

//等价于

/*
btn.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
System.out.println("The OK button is clicked");

JComponent jComponent = (JComponent) e.getSource();
if (jComponent instanceof JButton && btn == (JButton)jComponent){
    //这里相当于按钮什么都没做,该做的在if之前已经做了,
    //但是它既可以执行if之外的代码,也可以执行if子句的代码,试试看
}
    }
});
*/

//等价于

btn.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
JComponent jComponent = (JComponent) e.getSource();
if (jComponent instanceof JButton && btn == (JButton)jComponent){
System.out.println("The OK button is clicked");//把代码写进来来,
    //这里相当于按钮什么都没做,该做的在if之前已经做了,
    //但是它既可以执行if之外的代码,也可以执行if子句的代码,试试看
}
    }
});
    }

    public static void main(String args[]) {
OuterClassEvent frame = new OuterClassEvent();
frame.setTitle("外部类作为事件监听器");
frame.setLocationRelativeTo(null); // Center the frame
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(280, 100);
frame.setVisible(true);
// new ThisClassEvent();  
    }
}

class OuterClass implements ActionListener {
    public void actionPerformed(ActionEvent e) {
System.out.println("The OK button is clicked");
    }
}




#4


当addActionListener()时是不是会自动调用actionPerformed(ActionEvent e)的?
但是它不是要接受ActionEvent类的参数吗?程序什么时候传参的?它是多态?像这种没有指明调用actionPerformed(接受对象类)方法的接口混淆了!!!

#5


程序一直没有new 一个ActionEvent 类.也没有向它传值的.为什么add时传的是接口ActionListener,而实现方法接受的是ActionEvent类.为什么不出错啊

#6




interface moves{
    void jiao(String s);
}


class B implements moves{

    @Override
    public void jiao(String s) {
        System.out.println(s);
    }
    public static void main(String[] args) {
       String s=new String("ABCD");
       moves m=new B();
       m.jiao(s);
    }
}

接口调用不是要像这样要指明调用jiao()的!
addActionListener()里面没有调用actionPerformed()方法并且传值啊?
如果自动调用.它也会自动向里面传个ActionEvent 对象吗

#1


ActionEvent指示发生了组件定义的动作的语义事件。当特定于组件的动作(比如被按下)发生时,由组件(比如 Button)生成此高级别事件。事件被传递给每一个 ActionListener 对象,这些对象是使用组件的 addActionListener 方法注册的,用以接收这类事件。 

实现 ActionListener 接口的对象在发生事件时获取此 ActionEvent。因此,侦听器不必处理个别鼠标移动和鼠标单击的细节,而是可以处理像“按下按钮”这样的“有意义”(语义)事件。 

#2


程序什么时候在那里调用了actionPerformed()方法的.

#3




import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class OuterClassEvent extends JFrame {
    
    JButton btn;//为了看清楚怎么回事,把局部变量改为成员变量
    public OuterClassEvent() {
setLayout(new FlowLayout());
btn = new JButton("ok");//为了看清楚怎么回事,把局部变量改为成员变量
add(btn);
/*
OuterClass btListener=new OuterClass();
btn.addActionListener(btListener);  
 */

//等价于

/*
 btn.addActionListener(new OuterClass());  
 */

//等价于

/*
btn.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
System.out.println("The OK button is clicked");
    }
});
*/

//等价于

/*
btn.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
System.out.println("The OK button is clicked");

JComponent jComponent = (JComponent) e.getSource();
if (jComponent instanceof JButton && btn == (JButton)jComponent){
    //这里相当于按钮什么都没做,该做的在if之前已经做了,
    //但是它既可以执行if之外的代码,也可以执行if子句的代码,试试看
}
    }
});
*/

//等价于

btn.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
JComponent jComponent = (JComponent) e.getSource();
if (jComponent instanceof JButton && btn == (JButton)jComponent){
System.out.println("The OK button is clicked");//把代码写进来来,
    //这里相当于按钮什么都没做,该做的在if之前已经做了,
    //但是它既可以执行if之外的代码,也可以执行if子句的代码,试试看
}
    }
});
    }

    public static void main(String args[]) {
OuterClassEvent frame = new OuterClassEvent();
frame.setTitle("外部类作为事件监听器");
frame.setLocationRelativeTo(null); // Center the frame
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(280, 100);
frame.setVisible(true);
// new ThisClassEvent();  
    }
}

class OuterClass implements ActionListener {
    public void actionPerformed(ActionEvent e) {
System.out.println("The OK button is clicked");
    }
}




#4


当addActionListener()时是不是会自动调用actionPerformed(ActionEvent e)的?
但是它不是要接受ActionEvent类的参数吗?程序什么时候传参的?它是多态?像这种没有指明调用actionPerformed(接受对象类)方法的接口混淆了!!!

#5


程序一直没有new 一个ActionEvent 类.也没有向它传值的.为什么add时传的是接口ActionListener,而实现方法接受的是ActionEvent类.为什么不出错啊

#6




interface moves{
    void jiao(String s);
}


class B implements moves{

    @Override
    public void jiao(String s) {
        System.out.println(s);
    }
    public static void main(String[] args) {
       String s=new String("ABCD");
       moves m=new B();
       m.jiao(s);
    }
}

接口调用不是要像这样要指明调用jiao()的!
addActionListener()里面没有调用actionPerformed()方法并且传值啊?
如果自动调用.它也会自动向里面传个ActionEvent 对象吗