`

事件机制

 
阅读更多

                                                           事件机制

1.事件源对象(事件的接收者):

      凡是可以接受鼠标和键盘操作的都可以成为事件源对象(窗体上的标签,输入框,按钮等窗口界面类上的组件),被操作的这个对象就是该事件的事件源。

2.监听器(事件的传递者,将动作传给事件处理对象):

       每一个事件源对象都需要一个监听方法来监听事件源对象上发生的操作,通过绑定不同类型的Listner可以监听事件的不同信息(因为每个listner的功能不同)。

       通俗的讲相当与对事件源有一堆手下,每个手下都能监听不同的信息,根据不同的需要我们需要指派不同的手下去监听。(而且这个手下还能将监听到的东西交给对应的人处理)

       事件源对像.addActionListener(ActionListener al)         另外一些常用的监听方法:  //比较有用的手下

       事件源对象.addMouseListener(MouseListener al);
       事件源对象.addMouseMotionListener(MouseMotionListener al);
       事件源对象.addKeyListener(KeyListener al);

3.事件处理对象(事件的最终处理者):

       现在我们与要一个对象来处理监听到的事件(对事件源对象上的操作给予处理并向用户反馈信息),这就是上面监听方法中的参数ActionListener al。你的手下会将监听到的事件交给这个参数处理。      a1是实现了对应接口的类(该接口具备对监听到的信息进行处理的能力,这样这个类具备了处理该事件的能力)的一个实例化对象。该对象用来对监听到的事件进行处理。

   

 

 4.事件流程:

      在事件源对象上发生操作 -〉事件源对象将通过监听方法将收集到的事件源对象的信息及接受的操作,发送给监听方法中的参数(事件处理对象)进行处理   -〉事件处理对象根据传递过来的信息自动调用对应的事件方法对事件进行处理。

事件源与监听器的关系:

      事件源和监听器并不一定是一对一的关系,可以一个事件源绑定多个监听器,一个监听器也能监听多个事件源(这种情况在处理时间时就要判断是那个事件源传递过来事件)。

 

 5.参数传递:

       事件处理类对事件进行处理是一般需要用到事件源对象的方法和属性,所以我们需要把事件源对象传递给事件处理类。

       事件机制中参数传递主要是通过构造方法进行传递。

6.适配器:

           我们的事件处理对象都要实现相应监听器的接口才有能力处理相应的事件,但是我们可能只对其中的某个方法感兴趣,但是又不得不讲接口中的所有抽象方法进行重写。这时我们就可以使用适配器,Java.awt.event包提供了一系列的适配器类(KeyAdapter,MouthAdapter等),每个适配器类都对相应监听起接口中的所有方法进行了空实现,我们只要继承该适配器类就可以只对我们感兴趣的方法进行重写。但对于只有一个抽象方法的监听器接口没有提供与之相对应的适配器。

         使用适配器有他的好处但也有缺点,那就是适配器是类,我们只能进行单继承,这样造成一个类只能处理一类事件(例如继承了MouthAdaper就只能对鼠标的操作,单击,双击等做出反应,而不能对键盘输入做出反映),而用接口的话,可以同时实现keyListner和MouthListner,当然这种情况比较少,因为类的职责越单一越好。

6.事件处理的三种处理方式:

        内部类实现方式;匿名内部类实现,还有就是我们刚说的直接实现(用一个类实现相应接口,或继承相应适配器)

 ps:还可一直接实现和内部类实现相结合,在直接实现的那个类中定义多个内部类实现统一个接口,对接口中的同一个方法进行不同的重写,这样就可以在一个类中对同一个事件做出不同的响应。

 以上对事件机制的处理总结感觉说的太啰嗦了,还是直接用代码说明吧大笑

 

登陆界面类:

 

package Exercise1;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

/**
 * 定义一个登录界面类
 * @author Administrator
 *
 */
public class Login {
 public static void main(String[] args){
  Login login = new Login();
  //初始化登陆界面
  login.showFrame();
  
 }
 public void showFrame(){
  //创建一个窗体
  JFrame lg = new JFrame();
  //设置窗体的属性值
  lg.setTitle("登录界面");
  lg.setSize(200, 200);
  lg.setDefaultCloseOperation(3);
  lg.setLocation(450, 350);
  lg.setResizable(false);
  //设置窗体布局
  java.awt.FlowLayout fl = new java.awt.FlowLayout();
  lg.setLayout(fl);
  //创建添加账号密码标签及输入框
  JLabel jl = new JLabel("账号");

 JTextField txtName = new JTextField(12);

 JLabel jl_pass = new JLabel("密码");

JPasswordField jpf = new JPasswordField(12);

 //将该输入框放入窗体
  lg.add(jl);
  lg.add(txtName);
   lg.add(jl_pass);
  lg.add(jpf);
  //添加按钮
  JButton dl = new JButton("登录");
  dl.setActionCommand("login");//这是给计算机看的
  lg.add(dl);//将按钮放入窗体
  //设置窗体的可见性
  lg.setVisible(true);
  
  //实例化事件的处理对象
  LoginListener lo = new LoginListener(txtName,jpf);
  //给事件源对象增加监听方法
  dl.addActionListener(lo);
  jpf.addActionListener(lo);
 
 }

}

 

 
 

 

 

事件处理类:

package Exercise1;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

/**
 * 登录界面的处理类,实现ActionListener接口
 * @author Administrator
 *
 */
public class LoginListener implements ActionListener {
 //账号和密码输入框对象
 private JTextField txtName;
 private JPasswordField jpf;
 //事件处理类的构造方法
 public LoginListener(JTextField txtName,JPasswordField jpf){
  this.txtName = txtName;
  this.jpf = jpf;
 }
 //事件处理方法
 public void actionPerformed(ActionEvent e) {
    String command = e.getActionCommand();//得到开始设置的comand                      // dl.setActionCommand("login");//这是给计算机看的

  //输出信息
  System.out.println("你点击了"+e.getActionCommand()+"按钮");
  //获取账号和密码输入框中输入的值
  String name = txtName.getText();
  char[] passWord = jpf.getPassword();
 
  //判断账号密码是否输入正确
  if(command.equals("login")){
      if(name.equals("admin") && pwd.equals("admin")){
       //显示一个画板
       JFrame jf = new JFrame("画板");
       jf.setSize(300, 300);
       jf.setDefaultCloseOperation(3);
       jf.setLocation(300, 300);
       jf.setVisible(true);
   } else{
   JOptionPane.showMessageDialog(null,
     "你的输入的账号和密码错误,请重新输入!");
      }
      }
 
 }
}
0
14
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics