java事件监听机制
为何按钮无法登录?
在刚刚开始学习java的图形化界面编程的时,我们模仿qq制作一个简单的qq登录界面的时候。我们点击登录那个按钮,会发现并没有任何反应,而当我们使用qq的时候我们点击登录的按钮会出现一个新的界面出来。那么为什么我们点击我们制作的登录按钮的时候程序没有任何反应呢?这里就涉及到了下面要讲的事件监听机制。
什么是事件监听机制?
比如说我们也想实现类似于qq一样的,点击一个按钮就出现一个新的图形界面。我们就需要给我们的这个按钮添加一个监听器,当我们用鼠标去点击的时候就会,生成一个新的界面。监听器就好比生活中的传感器,当我们执行某一个事件的时候,传感器就发生变化。
java事件机制的参与角色有三种
1.event: object:事件状态对象,我好比我们用力去压一个力学传感器时,用力去压就是一个事件,当发生这个事件的时候,java会自动生成一个事件对象。用于相应的listener方法之中,作为参数,存在listener方法之中
2.event source:具体的事件源,它可以是java.awt包或者javax.swing包下的任何图形化组件。比如说我们刚刚那个登录按钮,我们点击它的时候它就是一个事件源
3.event listener:对每个明确的事件的发生,都相应地定义一个明确的Java方法。这些方法都集中定义在事件监听者(EventListener)接口中,这个接口要继承 java.util.EventListener。 实现了事件监听者接口中一些或全部方法的类就是事件监听者。
事件监听机制的实现
首先,我们要给事件源添加监听器,然后,当我们对事件源执行某一动作的时候,java会自动帮我们把这个动作封装成一个对象,这个对象中包括了事件源,之后,就是传达到监听器上面,监听器再执行相应的方法。就比如说我们想点击登录按钮实现一个新的界面,我们点击按钮这个事件源的时候,java把它封装起来,传给监听器,监听器在执行生成一个新的界面。
事件机制主要是分为四部分:
事件源,事件,监听器,以及相应的处理方法,前面三者java以及为我们提供好了,我们只需要做的就是监听器相应的方法的实现。就好比我们在我们的门上面装上了一个报警器,我们只需要处理报警器报警之后的事,而不需要处理其他的事。
下面是一个只有一个登录按钮的简单界面,点击登录后就会生成一个新的界面
主界面类:
public class LogIn { //创建一个现实界面的方法 public void init(){ //创建一个窗口类 javax.swing.JFrame jf= new javax.swing.JFrame("QQ登录界面1.0"); //给窗口类设置属性和方法 jf.setSize(431, 332); jf.setDefaultCloseOperation(3); jf.setLocationRelativeTo(null); //创建一个窗口为流式布局 java.awt.FlowLayout flowlayout = new java.awt.FlowLayout (); //设置流式布局 jf.setLayout(flowlayout); //创建一个按钮组件 javax.swing.JButton button = new javax.swing.JButton ("登录"); //设置按钮大小 button.setPreferredSize(new java.awt.Dimension(230,38)); //添加到窗体里 jf.add(button); //创建监听器对象 ButtonListener mbl = new ButtonListener (); //添加窗体对象 mbl.setJf(jf); //给监听器给按钮 button.addActionListener(mbl); //设置窗口可见 jf.setVisible(true); } public static void main (String[] args){ //创建一个login类 LogIn login = new LogIn(); //使用一个方法实现 login.init(); } }添加监听器生成一个新的窗口:
public class ButtonListener implements java.awt.event.ActionListener{ //重写接口中的方法 private JFrame jf; //传递窗体对象 public void setJf(JFrame argJf){ jf = argJf; } //点击动作的按钮 public void actionPerformed(ActionEvent e){ //生成一个新的窗体 JFrame jfr = new JFrame(); //给窗口类设置属性和方法 jfr.setSize(200, 200); jfr.setDefaultCloseOperation(3); jfr.setLocationRelativeTo(null); //设置窗口可见 jfr.setVisible(true); //销毁登录窗口 jf.dispose(); } }