> 文档中心 > 10分钟带你理解事件处理的奥秘

10分钟带你理解事件处理的奥秘

目录

事件处理

GUI事件处理机制

牛刀小试

常见的时间和事件监听器

事件

低级事件

高级事件

事件监听器

牛刀小试01

牛刀小试02


      前面几篇一直都用到点击事件监听事件,但是Nick一直没细说,有没有很着急?那么这篇博客笔记将带着大家一起学习事件处理

           

事件处理

GUI事件处理机制

定义:

当在某个组件上发生某些操作的时候,会自动的触发一段代码的执行。 在GUI事件处理机制中涉及到4个重要的概念需要理解:

  • 事件源(Event Source)∶操作发生的场所,通常指某个组件,例如按钮、窗口等;

  • 事件(Event) :在事件源上发生的操作可以叫做事件,GUI会把事件都封装到一个Event对象中,如果需要知道该事件的详细信息,就可以通过Event对象来获取。

  • 事件监听器(Event Listener);当在某个事件源上发生了某个事件,事件监听器就可以对这个事件进行处理。

  • 注册监听︰把某个事件监听器(A通过某个事件(B)绑定到某个事件源(C)上,当在事件源C上发生了事件B之后,那么事件监听器A的代码就会自动执行。

    

API

    

使用步骤

  • 创建事件源组件对象﹔

  • 自定义类,实现XxxListener接口,重写方法;

  • 创建事件监听器对象(自定义类对象)

  • 调用事件源组件对象的addXxxListener方法完成注册监听

   

牛刀小试

     

效果展示

     

代码展示

import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;public class EventDemo  {    Frame frame = new Frame("这里测试事件处理");    TextField tf = new TextField(30);    //事件源    Button ok = new Button("确定");    //内部类//    private class MyListener implements ActionListener{// @Override// public void actionPerformed(ActionEvent e) {//     tf.setText("HelloWorld");// }//    }    public void init(){ //组装视图 //监听器      //MyListener myListener = new MyListener();      //ok.addActionListener(myListener); //注册监听(匿名内部类) ok.addActionListener(new ActionListener() {     @Override     public void actionPerformed(ActionEvent e) {  System.out.println("Ok按钮被点击了...");  tf.setText("Hello World");     } }); //把tf和ok放到Frame中 frame.add(tf,BorderLayout.NORTH); frame.add(ok); frame.pack(); frame.setVisible(true);    }    public static void main(String[] args) { new EventDemo().init();    }}

   

不知道大家有没有看到这个代码?

想想是干嘛用的?

    //内部类    private class MyListener implements ActionListener{ @Override public void actionPerformed(ActionEvent e) {     tf.setText("HelloWorld"); }    }      //MyListener myListener = new MyListener();      //ok.addActionListener(myListener);

   

总结/提示

  • 监听器只用一次的话匿名内部类方便,要是会被多次用到,则内部类方便。
  • 乱码问题

    

   

常见的时间和事件监听器

      事件监听器必须实现事件监听器接口,AMT提供了大量的事件监听器接口用于实现不同类型的事件监听器,用于监听不同类型的事件。AMT中提供了丰富的事件类,用于封装不同组件上所发生的特定操作,AWT 的事件类都是AWTEvent类的子类,AWTEvent是EventObject的子类。

     

事件

    

AWT把事件分为了两大类:

低级事件

      这类事件是基于某个特定动作的事件。比如进入、点击、拖放等动作的鼠标事件,再比如得到焦点和失去焦点等焦点事件。

    

      

  • ComponentEvent 构件事件,构件尺寸的变化以及移动
  • ContainerEvent 容器事件,构件增加,移动
  • WindowEvent 窗口事件,关闭窗口,窗口闭合,图标化
  • FocusEvent 焦点事件,焦点的获得与丢失
  • KeyEvent 键盘事件,键按下,释放
  • MouseEvent 鼠标事件,鼠标点击,移动

    

高级事件

      这类事件并不会基于某个特定动作,而是根据功能含义定义的事件。

    

      

  • ActionEvent 动作事件,按键按下,TextField中按下Enter键
  • AdjustmentEvent 调节事件,在滚动条上移动滑块以调节数值
  • ItemEvent 项目事件,选择项目,不选择“项目改变”
  • TextEvent 文本事件,文本对象改变

     

事件监听器

    

      不同的事件需要使用不同的监听器监听,不同的监听器需要实现不同的监听器接口,当指定事件发生后,事件监听器就会调用所包含的事件处理器(实例方法)来处理事件。

    

    

牛刀小试01

任务:

  • 通过ContainerListener监听Frame容器添加组件;
  • 通过TextListener监听TextFiled内容变化;
  • 通过ItemListener监听Choice条目选中状态变化;

   

      

     

      

代码展示

import javax.swing.*;import java.awt.*;import java.awt.event.*;public class ListenerDemo01 {    public static void main(String[] args) { Frame frame = new Frame("这里测试监听器"); //创建组件(事件源) TextField tf = new TextField(30); Choice names = new Choice(); names.add("Bob"); names.add("Nick"); names.add("Lucy"); //给文本域添加TextListener,监听内容变化 tf.addTextListener(new TextListener() {     @Override     public void textValueChanged(TextEvent e) {  String text = tf.getText();  System.out.println("当前文本框的内容为:"+text);     } }); //给下拉选择器添加ItemListener,监听条目选项变化 names.addItemListener(new ItemListener() {     @Override     public void itemStateChanged(ItemEvent e) {  Object item = e.getItem();  System.out.println("当前选中的条目为:"+item);     } }); //给frame注册ContainerListener监听器,监听容器中组件的添加 frame.addContainerListener(new ContainerListener() {     @Override     public void componentAdded(ContainerEvent e) {  Component child = e.getChild();  System.out.println("frame中添加了"+child);     }     @Override     public void componentRemoved(ContainerEvent e) {     } }); //添加到frame中 Box hBox = Box.createHorizontalBox(); hBox.add(names); hBox.add(tf); frame.add(hBox); //设置大小并可见 frame.pack(); frame.setVisible(true);    }}

    

 总结/提示

  • 乱码问题

     

牛刀小试02     

任务

      给Frame设置WindowListner,监听用户点击X的动作,如果用户点击X,则关闭当前窗口。

     

    

代码展示

import java.awt.*;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;public class ListenerDemo02 {    public static void main(String[] args) { Frame frame = new Frame("这里测试WindowListener"); frame.setBounds(200,200,500,300); //设置WindowListener,简体用户点击X的动作,如果点击X,侧关闭窗口 frame.addWindowListener(new WindowAdapter() {     @Override     public void windowClosing(WindowEvent e) {  //停止当前程序  System.exit(0);     } }); frame.setVisible(true);    }}

        

  总结/提示

  • 乱码问题

今天的干货笔记就分享到这啦!

下一篇会讲

菜单组件

   敬请期待哦!

驱动天空下载