关于事件监听机制的总结(Listener和Adapter)

记得以前看过事件监听机制背后也是有一种设计模式的.(设计模式的名字记不清了,只记得背后实现的数据结构是数组.)

附上事件监听机制的分析图:

一个事件源可以承载多个事件(只要这个事件源支持这个事件就可以,男人就不支持生孩子的事件)  事件和监听器有对应关系的.

下面用awt中的标准图形化界面分析:

接口WindowListener 中有一个实现类WindowAdapter类.适配器类.

EventListener.java 下面是所有超级接口EventListener.java的源代码   其实就是一个空接口.

1 package java.util;
2 
3 /**
4  * A tagging interface that all event listener interfaces must extend.
5  * @since JDK1.1
6  */
7 public interface EventListener {
8 }

WindowListener.java 这个接口的源代码  定义了一些抽象方法

 1 public interface WindowListener extends EventListener {
 2     /**
 3      * Invoked the first time a window is made visible.
 4      */
 5     public void windowOpened(WindowEvent e);
 6 
 7     public void windowClosing(WindowEvent e);
 8 
 9     public void windowClosed(WindowEvent e);
10 
11     public void windowIconified(WindowEvent e);
12 
13     public void windowDeiconified(WindowEvent e);
14 
15     public void windowActivated(WindowEvent e);
16 
17     public void windowDeactivated(WindowEvent e);
18 }

WindowAdapter.java这个实现类的源代码: WindowAdapter是一个抽象类.但是这个抽象类里面却没有抽象方法!!!!!!!

所有的方法都是空实现!!!空方法!!!

 1 public abstract class WindowAdapter
 2     implements WindowListener, WindowStateListener, WindowFocusListener
 3 {
 4     /**
 5      * Invoked when a window has been opened.
 6      */
 7     public void windowOpened(WindowEvent e) {}
 8 
 9     public void windowClosing(WindowEvent e) {}
10 
11     public void windowClosed(WindowEvent e) {}
12 
13     public void windowIconified(WindowEvent e) {}
14 
15     public void windowDeiconified(WindowEvent e) {}
16 
17     public void windowActivated(WindowEvent e) {}
18 
19     public void windowDeactivated(WindowEvent e) {}
20 
21     public void windowStateChanged(WindowEvent e) {}
22 
23     public void windowGainedFocus(WindowEvent e) {}
24 
25     /**
26      * Invoked when the Window is no longer the focused Window, which means
27      * that keyboard events will no longer be delivered to the Window or any of
28      * its subcomponents.
29      *
30      * @since 1.4
31      */
32     public void windowLostFocus(WindowEvent e) {}
33 }

窗口事件的抽象适配器类(WindowAdapter).此类中的方法为空.此类存在的目的是方便创建监听器对象.

如果实现WindowListener 就要覆盖其中的所有抽象方法,但是继承WindowAdapter就不需要了,JDK为你定义好了这样的一个适配器类,

实现了所有WindowListener接口中的抽象方法.所以只需继承WindowAdapter类就可以了.需要什么方法就覆盖其中的方法.

EventListener是接口,WindowListener 也是接口,WindowAdapter是一个抽象类.

EventListener接口是一个空接口,WindowListener接口定义了一些公用的抽象方法,WindowAdapter是一个抽象类,但是里面没有任何的抽象方法.

要深入理解抽象类和接口的区别.

抽象类可以不含有抽象方法的!!!

因为这样有两个好处.

1.不让该类创建对象.

2.方便创建该接口的对象.

继承我这个抽象类,选择其中的一个方法去覆盖就可以了

在其中直接用匿名内部类就可以了.用哪个覆盖哪个.

 

给一个按钮增加一个活动监听.ActionListener

在Button类中有一个addActionListener(Listener l)  添加指定的动作侦听器,以接收发自此按钮的动作事件。

 

其中要传入一个ActionListener对象.看一下这个ActionListener对象

这个ActionListener对象有N多实现类,但是却不像WindowsLisntener一样有一个对应的适配器类.因为这个ActionListener接口中只有一个方法.

这就是一种原则,规则性的问题.

只要监听器中的方法超过两个一般都有一个对应的适配器,但是这个ActionListener接口中只有一个方法.

监听器中有两个或者两个以内方法的话没有对应适配器类的,创建本身就很方便.

addActionListener(ActionListener l)方法参数传递的是接口型引用,ActionListener本身方法又不多(就只有一个方法,只要覆写一个或者两个就可以了),

方法参数中用匿名内部类就可以了,这样表示看着更简洁明了.

 

窗体监听(WindowListener)和活动监听(ActionListener)

 下面附上代码Demo 

 1 import java.awt.Button;
 2 import java.awt.FlowLayout;
 3 import java.awt.Frame;
 4 import java.awt.event.ActionEvent;
 5 import java.awt.event.ActionListener;
 6 import java.awt.event.WindowAdapter;
 7 import java.awt.event.WindowEvent;
 8 
 9 public class FrameDemo {
10     public static void main(String[] args) {
11 
12         Frame f = new Frame("my frame");
13         f.setBounds(400, 200, 500, 400);        
14         f.setLayout(new FlowLayout());//设置流式布局
15         
16         Button but  = new Button("一个按钮");
17         f.add(but);//将按钮添加到窗体中。 
18         
19         f.addWindowListener(new WindowAdapter() {
20             @Override
21             public void windowClosing(WindowEvent e) {
22                 //System.out.println("closing......."+e);
23                 System.exit(0);
24             }
25         });
26         //在按钮上加上一个监听。  点击按钮"一个按钮"就关闭
27         but.addActionListener(new ActionListener() {
28             @Override
29             public void actionPerformed(ActionEvent e) {
30                 //System.out.println("button run .....");
31                 System.exit(0);
32             }
33         });
34         f.setVisible(true);
35         System.out.println("over");
36     }
37 }

点击"右上角的×"和"一个按钮"都是关闭的效果.

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Adapter 点击事件通常有以下几种实现方式: 1. 在 Adapter 中设置点击事件监听器,在监听器中处理点击事件。 ```java public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private List<String> mData; private OnItemClickListener mListener; public interface OnItemClickListener { void onItemClick(int position); } public void setOnItemClickListener(OnItemClickListener listener) { mListener = listener; } public class ViewHolder extends RecyclerView.ViewHolder { public TextView mTextView; public ViewHolder(View itemView) { super(itemView); mTextView = itemView.findViewById(R.id.tv_item); itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (mListener != null) { int position = getAdapterPosition(); mListener.onItemClick(position); } } }); } } // ... } ``` 2. 在 Activity 或 Fragment 中设置点击事件监听器,在监听器中处理点击事件。 ```java public class MyActivity extends AppCompatActivity { private RecyclerView mRecyclerView; private MyAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); mRecyclerView = findViewById(R.id.recycler_view); mAdapter = new MyAdapter(getData()); mRecyclerView.setAdapter(mAdapter); mAdapter.setOnItemClickListener(new MyAdapter.OnItemClickListener() { @Override public void onItemClick(int position) { // 处理点击事件 } }); } // ... } ``` 3. 使用第三方库实现点击事件,如:`EasyRecyclerView`、`BaseRecyclerViewAdapterHelper` 等。这些库在 Adapter 中提供了更加简便的点击事件处理方式,具体可根据库的文档进行使用。 不同的实现方式适用于不同的场景,具体选择哪种方式需要根据实际情况进行判断。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值