GUI中常见事件和事件监听器

事件处理

前面介绍了如何放置各种组件,从而得到了丰富多彩的图形界面,但这些界面还不能响应用户的任何操作。比如单击前面所有窗口右上角的“X”按钮,但窗口依然不会关闭。因为在 AWT 编程中 ,所有用户的操作,都必须都需要经过一套事件处理机制来完成,而 Frame 和组件本身并没有事件处理能力 。

GUI事件处理机制

定义:

​ 当在某个组件上发生某些操作的时候,会自动的触发一段代码的执行。

在GUI事件处理机制中涉及到4个重要的概念需要理解:

事件源(Event Source):操作发生的场所,通常指某个组件,例如按钮、窗口等;
事件(Event):在事件源上发生的操作可以叫做事件,GUI会把事件都封装到一个Event对象中,如果需要知道该事件的详细信息,就可以通过Event对象来获取。
事件监听器(Event Listener):当在某个事件源上发生了某个事件,事件监听器就可以对这个事件进行处理。

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BToAwrNi-1612247458974)(./images/事件处理机制.png)]
在这里插入图片描述

使用步骤:

1.创建事件源组件对象;

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

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

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

案例:

​ 完成下图效果,点击确定按钮,在单行文本域内显示 hello world:

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xqxd1byg-1612247458981)(./images/EventDemo1.jpg)]

演示代码:

public class EventDemo1 {
    Frame  frame = new Frame("这里测试事件处理");

    //事件源
    Button button = new Button("确定");

    TextField tf = new TextField(30);
    public void init(){
        //注册监听
        button.addActionListener(new MyActionListener());

        //添加组件到frame中
        frame.add(tf);
        frame.add(button,BorderLayout.SOUTH);

        //设置frame最佳大小并可见
        frame.pack();
        frame.setVisible(true);
    }

    //自定义事件监听器类
    private  class MyActionListener implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {

            System.out.println("用户点击了确定按钮");
            tf.setText("hello world");
        }
    }
    
    public static void main(String[] args) {
        new EventDemo1().init();
    }
}

在这里插入图片描述
在这里插入图片描述

GUI中常见事件和事件监听器

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

事件

AWT把事件分为了两大类:

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

事件触发时机
ComponentEvent组件事件 , 当 组件尺寸发生变化、位置发生移动、显示/隐藏状态发生改变时触发该事件。
ContainerEvent容器事件 , 当容器里发生添加组件、删除组件时触发该事件 。
WindowEvent窗口事件, 当窗 口状态发生改变 ( 如打开、关闭、最大化、最 小化)时触发该事件 。
FocusEvent焦点事件 , 当组件得到焦点或失去焦点 时触发该事件 。
KeyEvent键盘事件 , 当按键被按下、松开、单击时触发该事件。
MouseEvent鼠标事件,当进行单击、按下、松开、移动鼠标等动作 时触发该事件。
PaintEvent组件绘制事件 , 该事件是一个特殊的事件类型 , 当 GUI 组件调 用 update/paint 方法 来呈现自身时触发该事件,该事件并非专用于事件处理模型 。

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

事件触发时机
ActionEvent动作事件 ,当按钮、菜单项被单击,在 TextField 中按 Enter 键时触发
AjustmentEvent调节事件,在滑动条上移动滑块以调节数值时触发该事件。
ltemEvent选项事件,当用户选中某项, 或取消选中某项时触发该事件 。
TextEvent文本事件, 当文本框、文本域里的文本发生改变时触发该事件。
事件监听器

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

事件类别描述信息监听器接口名
ActionEvent激活组件ActionListener
ItemEvent选择了某些项目ItemListener
MouseEvent鼠标移动MouseMotionListener
MouseEvent鼠标点击等MouseListener
KeyEvent键盘输入KeyListener
FocusEvent组件收到或失去焦点FocusListener
AdjustmentEvent移动了滚动条等组件AdjustmentListener
ComponentEvent对象移动缩放显示隐藏等ComponentListener
WindowEvent窗口收到窗口级事件WindowListener
ContainerEvent容器中增加删除了组件ContainerListener
TextEvent文本字段或文本区发生改变TextListener

案例

案例一:

​ 通过ContainerListener监听Frame容器添加组件;

​ 通过TextListener监听TextFiled内容变化;

​ 通过ItemListener监听Choice条目选中状态变化;

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0zfXIDS9-1612247458983)(./images/ListenerDemo1.jpg)]

演示代码一:

import java.awt.*;
import java.awt.event.ContainerAdapter;
import java.awt.event.ContainerEvent;
import java.awt.event.TextEvent;
import java.awt.event.TextListener;

public class ListenerDemo1 {

    public static void main(String[] args) {
        Frame frame = new Frame("这里测试监听器");

        //创建一个单行文本域
        TextField tf = new TextField(30);

        //给文本域添加TextListener,监听内容的变化
        tf.addTextListener(new TextListener() {
            @Override
            public void textValueChanged(TextEvent e) {
                System.out.println("当前内容:"+tf.getText());;
            }
        });


        //给frame注册ContainerListener监听器,监听容器中组件的添加
        frame.addContainerListener(new ContainerAdapter() {
            @Override
            public void componentAdded(ContainerEvent e) {
                Component child = e.getChild();
                System.out.println("容器中添加了新组件:"+child);
            }
        });


        //添加tf到frame
        frame.add(tf);

        //设置frame最佳大小并可见
        frame.pack();
        frame.setVisible(true);
    }
}

在这里插入图片描述

案例2:

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

演示代码2:

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class ListenerDemo2 {

    public static void main(String[] args) {

        Frame frame = new Frame("这里测试WindowListener");



        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

        frame.setBounds(200,200,500,300);

        frame.setVisible(true);
    }
}
  • 7
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目 录 一、课设任务及要求 1 二、需求分析 2 三、设计思路 3 四、详细设计 5 五、运行调试与分析讨论 9 六、设计体会与小结 14 七、参考文献 15 附录 16 文摘要 Java是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的总称。用Java实现 的HotJava浏览,显示了Java的魅力:跨平台、动感的Web、Internet计算。从此,Ja va被广泛接受并推动了Web的迅速发展,常用的浏览现在均支持Java applet。另一方面,Java技术也不断更新。Java平台由Java虚拟机和Java 应用编程接口构成。Java 应用编程接口为Java应用提供了一个独立于操作系统的标准接口,可分为基本部分和扩 展部分。在硬件或操作系统平台上安装一个Java平台之后,Java应用程序就可运行。现 在Java平台已经嵌入了几乎所有的操作系统。这样Java程序可以只编译一次,就可以在 各种系统运行。 Java分为三个体系J2SE,J2EE,J2ME。 说起计算,值得我们骄傲的是,最早的计算工具的诞生地是国。 在17世纪初,西方国家的计算工具才有了较大的发展,英国数学家纳皮尔发明的"纳 皮尔算筹",英国牧师奥却德发明了圆柱型对数计算尺,这种计算尺不仅能做加减乘除、 乘方、开方运算,甚至可以计算三角函数,指数函数和对数函数,这些计算工具不仅带 动了计算的发展,也为现代计算发展奠定了良好的基础,进而成为了现代社会应用 广泛的计算工具。 关键词:java Java平台 计算 课设任务及要求 1.课设任务 这次课程设计选择的题目为设计一个图形界面(GUI)的计算应用程序,完成简单 的算术运算。 这次课程设计的基本要求为设计的计算应用程序可以完成加法、减法、乘法、除 法和取余运算,且有小数点、正负号、求倒数、退格和清零功能。拓展功能根据自己的 能力添加。 这次课程设计的我选择添加的拓展功能为开平方根,平方,立方,判断素数,求lo g的功能。 本程序主要练习使用布局管理设计一个计算的界面,并练习使用事件监听处 理数据的输入,并完成相关的计算。数据和运算符号的存储采用动态链表这种数据结构 实现。 这次课程设计选择的Java运行环境为: Windows XP sp3 +Eclipse+JDK 1.6 二、需求分析 1.系统功能需求分析 计算是现在一个普遍应用的工具,能够解决许多人所无法计算的数据,节省大量 宝贵的时间。 2.系统功能分析 为了实现计算系统的功能.主要有二个功能模块:输入、输出。 3.系统设计原则 基于计算系统要具有适用性广、操作简便等特点.本系统预计要达到以下几个目标 : (1)、满足以上的功能要求; (2)、能够运行在常见的计算机及其配置上; 三、设计思路 1.关于布局问题 本次课程设计程序继承来自框架类(Frame),总体布局上选用布局管理BorderLayout: (1)将单行文本框加入到"North"区域 (2)将面板panel加入到"Center"区域,同时panel包含了各种数字按钮和符号按钮。 面板panel采用Girdlayout布局,选用5行*5列,将各种按钮添加到面板panel,并增加按 钮监听事件。 布局完成后的效果图如下: 2.关于数据存储问题 计算完成的是一个数学表达式,本次课程设计我选用的是使用链表(Linkedlist类 )来存储数字和运算符号。程序运行后,输入的所有数字及运算符号都全部存储在链表 ,待最后运算时,再一一求出来进行计算。 3.关于事件监听的处理问题 计算的各种按钮都需要一个对象来进行监视,以便对发生的事件做出处理。计算 的各种按钮通过调用相应的方法将某个对象作为自己的监视。 例如计算的数字按钮,其方法为: AddActionListener(监视); 对于获取了监视的数字按钮,通过相应的操作就会导致事件的发生,并通知监视 ,监视就会做出相应的处理。 四、详细设计 1.计算系统主要功能模块 (1)、系统主要模块实现的功能 系统输入模块实现数字以及计算符号输入的功能,输出模块的结果在文本框实现显 示。 (2)、系统输入窗体实现的效果 系统输入窗体设计效果如图所示: 上图为按数字键1234567890后,在文本框的显示 (3)、系统主要模块功能描述 功能描述: 菜单项"计算"主要服务于使用者.它包含了"输入"、"输出"、 两个功能。 输入功能:当使用者将数字输入后,会出现数字的显示;当使用者将计算符号输入时 候会有计算符号的录入。 输出功能:点击"输出"选项后.可实现计算的结果。 2.系统的实现 (1) 系统源文件类之间的关系 计算系统共有3个java源文件:Calcul

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值