Java-GUI编程之事件处理

博客 动态
0 195
羽尘
羽尘 2022-04-06 10:57:38
悬赏:0 积分 收藏

Java-GUI编程之事件处理

事件处理

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

GUI事件处理机制

定义:

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

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

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

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

使用步骤:

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

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

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

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

案例:

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

import java.awt.*;import java.awt.event.ActionListener;import java.awt.event.ActionEvent;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条目选中状态变化;

import javax.swing.*;import java.awt.*;import java.awt.event.*;public class ListenerDemo1 {    public static void main(String[] args) {        Frame frame = new Frame("这里测试监听器");        // 创建组件(事件源)        TextField tf = new TextField(30);        Choice names = new Choice();        names.add("柳岩");        names.add("舒淇");        names.add("闫妮");        // 给文本域添加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最佳大小并可见        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() {            public void windowClosing(WindowEvent e) {                System.exit(0);            }        });        frame.setBounds(200,200,500,300);        frame.setVisible(true);    }}

公众号文章地址:https://mp.weixin.qq.com/s/0BOBUP2pFrizTJ4mZNQP6w

个人博客:https://kohler19.gitee.io/
公众号:愚生浅末

posted @ 2022-04-06 09:42 愚生浅末 阅读(1) 评论(0) 编辑 收藏 举报
回帖
    羽尘

    羽尘 (王者 段位)

    2335 积分 (2)粉丝 (11)源码

     

    温馨提示

    亦奇源码

    最新会员