广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >java中事件图文详解
  • 152
分享到

java中事件图文详解

java 2021-10-07 04:10:59 152人浏览 猪猪侠
摘要

学习java事件之前,对java内部类、java常用组件、容器、布局管理器、java抽象窗口工具包这些东西有一定的了解,结合下面的知识点,可以做一些简单的窗口程序。(推荐:java视频教程)Java语言对事件的处理采用的是授权事件模型。在这

学习java事件之前,对java内部类、java常用组件、容器、布局管理器、java抽象窗口工具包这些东西有一定的了解,结合下面的知识点,可以做一些简单的窗口程序。(推荐:java视频教程

Java语言对事件的处理采用的是授权事件模型。在这个模型下,每个组件都有相应的事件,如按钮有单击事件,文本域具有内容改变事件等。

当某个事件被触发后,组件就会将事件发送给组件注册的每一个事件监听器,事件监听器中定义了与不同事件相对应的事件的处理,此时事件监听器会根据不同的事件信息调用不同的事件处理者,完成对这次事件的处理,只有事件监听器被触发后才会收到事件信息。

此种模型的显著特点是,当组件被触发后,本身不去处理,而将处理的 操作交给第三方完成。例如,在GUI单击了一个按钮,此时该按钮就是一个事件源对象,按钮本身没有权利对这次单击做出反应,它做的就是将信息发送给本身注册的监听器(事件的处理者,实质上也是个类)来处理。

理解java的事件处理要要理解下面三个重要的概要。

(1)、事件Event——用户操作而产生的事件

(2)、事件源Event source——产生事件的组件

(3)、事件处理方法Event handle——处理事件的方法

1、事件处理基本原理

挡在一个按钮上触发一个事件时,虚拟机产生一个点击事件对象,然后在按钮即事件源上查找注册的相关处理方法,并将事件对象传给此方法,此方法获得执行。

示例程序:

在下面的程序中JButton jb就是事件源,ClickAction就是事件处理程序,jb.addActionListener(a);将事件源和事件处理程序关联起来,当事件源上发生点击事件的时候,执行ClickAction里面定义的代码。

源代码如下:

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

import javax.swing.JButton;
import javax.swing.JFrame;

public class EventTest {

    public static void main(String[] args) {

        JFrame j = new JFrame("示例程序1");
        //1、事件源jb按钮就是事件源,因为要点击它
        JButton jb = new JButton("click");
        //2、事件处理程序ClickAction表示事件处理程序
        ClickAction a = new ClickAction();
        //3、关联,将事件源和事件处理程序a关联起来,意思是发生点击执行a
        jb.addActionListener(a);
        //将jb源事件添加到窗口中。
        j.getContentPane().add(jb);
        j.pack();
        j.setVisible(true);
    }
}

//事件处理程序,点击就是一个Action事件
class ClickAction implements ActionListener{

    @Override
    public void actionPerfORMed(ActionEvent e) {
        // TODO Auto-generated method stub
        System.out.println("hello");
    }
}

2、事件对象

在上面你的例子中,ActionEvent就是一个事件对象,在JButton被按下的时候,由JButton生成此事件。事件被传递给通过注册监听器的方式注册的ActionListener对象,通过它可以得到事件发生的时间,事件发生时的事件源等最常见的信息。

ActionEvent常见方法如下:

(1)String getActionCommand():返回与此类动作相关的命令字符串,默认组件为title。

(2)int getModifiers():返回发生此动作时同时按下的键盘按钮

(3)long getWhen():返回发生此事件时的事件的long形式。

示例程序:
源代码如下:

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

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class EventTest2 {

    public static void main(String[] args) {

        JFrame j = new JFrame("示例程序2");
        JPanel jp = new JPanel();
        JLabel j1 = new JLabel("请点击");
        JButton jb = new JButton("click");
        JButton jb1 = new JButton("click");
        ClickAction2 a = new ClickAction2();
        jb1.addActionListener(a);//如果jb1上发生了Action事件就执行a里面的代码
        jb.addActionListener(a);
        jp.add(j1);
        jp.add(jb);
        jp.add(jb1);
        j.add(jp);
        j.setSize(400, 200);
        j.setVisible(true);

    }

}

class ClickAction2 implements ActionListener{

    //事件发生时,actionPerformed方法会被虚拟机调用,事件对象回传给该方法
    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
         long d = e.getWhen();//事件发生的事件
         Date date = new Date(d);//转化为相应的时间
         System.out.println(date);
         JButton sou = (JButton)e.getSource();//发生的事件源
         sou.setText("点不着");//将点击发生的按钮的按钮设为点不着
         //如果没有设置过ActionCommand,默认得到的是按钮的标题
         String com = e.getActionCommand();
         System.out.println("command is: " +com);
    }

}

3、事件类型

图形界面开发中由很多的事件,这些事件以EventObject为顶层和类,按事件的类型构成了一个树形结构。

具体见下图:

1.jpg

EventObject是所有事件类的父类,它里面包含两个方法:

(1)、Object getSource():最初发生Event的对象

(2)、String toString():返回此EventObject的String表示形式。

通过getSource():能够知道事件是在那个对象上发生的。

关于其他事件类的含义,在下面会给出几个类的源码解释和简单演练。

MouseEvent类

当在一个组件上按下,释放,点击,移动或者拖动时,就会触发鼠标事件。

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
public class MouseListenerTest {
    public static void main(String[] args) {
        JFrame j = new JFrame("我的窗口");
        MouL w = new MouL();
        j.addMouseListener(w);
        j.setSize(100, 100);
        j.setVisible(true);
        j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

class MouL implements MouseListener{

    @Override
    public void mouseClicked(MouseEvent e) {
        // TODO Auto-generated method stub
        System.out.println("鼠标的位置: " + e.getX() + "," + e.getY());
        System.out.println("点击发生了");
    }

    @Override
    public void mousePressed(MouseEvent e) {
        // TODO Auto-generated method stub
        System.out.println("按下");
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        // TODO Auto-generated method stub
        System.out.println("松开");
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        // TODO Auto-generated method stub
        System.out.println("鼠标进入了窗口");
    }

    @Override
    public void mouseExited(MouseEvent e) {
        // TODO Auto-generated method stub
        System.out.println("鼠标离开了窗口");
    }
}

WindowEvent类

窗口事件,窗口打开,关闭,最大化,最小化时,都会触发窗口事件

import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.JFrame;

public class windowsListenerTest {

    public static void main(String[] args) {

        JFrame j = new JFrame("我的窗口");
        WindowL w = new WindowL();
        j.addWindowListener(w);
        j.setSize(100, 100);
        j.setVisible(true);
        j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

class WindowL implements WindowListener{

    @Override
    public void windowOpened(WindowEvent e) {
        // TODO Auto-generated method stub
        System.out.println("窗口打开时我执行windowOpened");
    }

    @Override
    public void windowClosing(WindowEvent e) {
        // TODO Auto-generated method stub
        System.out.println("windowClosing");
    }

    @Override
    public void windowClosed(WindowEvent e) {
        // TODO Auto-generated method stub
        System.out.println("窗口关闭时我执行windowClosed");
    }

    @Override
    public void windowIconified(WindowEvent e) {
        // TODO Auto-generated method stub
        System.out.println("窗口最小化时我执行windowIconified");
    }

    @Override
    public void windowDeiconified(WindowEvent e) {
        // TODO Auto-generated method stub
        System.out.println("窗口回复时我执行windowDeiconified");
    }

    @Override
    public void windowActivated(WindowEvent e) {
        // TODO Auto-generated method stub
        System.out.println("窗口变成活动状态时我执行mouseClicked");
    }

    @Override
    public void windowDeactivated(WindowEvent e) {
        // TODO Auto-generated method stub
        System.out.println("窗口变成不活动状态时我执行windowDeactivated");
    }

}

ContainerEvent类

当一个组件被加到容器中时或者从一个容器中删除一个组件时,会触发事件。

import java.awt.event.ContainerListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ContainerEvent {

    public static void main(String[] args) {

        JFrame j = new JFrame("我的窗口");
        ContL w = new ContL();
        JPanel jp = new JPanel();

        jp.addContainerListener(w);

        JButton del = new JButton("删除");
        JButton add = new JButton("add");

        jp.add(add);
        jp.add(del);//触发组件添加了

        jp.remove(del);//触发组件删除了

        j.getContentPane().add(jp);
        j.setSize(100, 100);
        j.setVisible(true);
        j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

}

class ContL implements ContainerListener{

    @Override
    public void componentAdded(java.awt.event.ContainerEvent e) {
        // TODO Auto-generated method stub
        System.out.println("组件添加了");
    }

    @Override
    public void componentRemoved(java.awt.event.ContainerEvent e) {
        // TODO Auto-generated method stub
        System.out.println("组件删除了");
    }

}

FocusEvent

鼠标点击等操作会让一个组件得到或者失去焦点。当一个组件得到焦点的时候,或者失去焦点的时候,就会触发焦点事件

import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class FocusTest {

    public static void main(String[] args) {

        JFrame j = new JFrame("key test");
        JPanel jp = new JPanel();
        JButton j1 = new JButton("1");
        JButton j2 = new JButton("2");
        j1.addFocusListener(new FocusL());
        j2.addFocusListener(new FocusL());
        jp.add(j1);
        jp.add(j2);
        j.add(jp);
        j.setSize(600, 500);
        j.setVisible(true);
    }

}

class FocusL implements FocusListener{

    @Override
    public void focusGained(FocusEvent e) {
        //得到FocusEvent发生时的对象,转化为按钮
        // TODO Auto-generated method stub
        JButton j = (JButton)e.getSource();
        //得到按钮的标题
        String title = j.getText();
        System.out.println("focusGained:按钮" + title + "获得焦点");
    }

    @Override
    public void focusLost(FocusEvent e) {
        // TODO Auto-generated method stub
        JButton j = (JButton)e.getSource();
        String title = j.getText();
        System.out.println("focusLost:按钮" + title + "失去焦点");
    }

}

4、多重监听器

一般情况下,事件源可以产生多种不同类型的事件,因而可以注册(触发)多种不同类型的监听器。

一个事件源组件上可以注册多个监听器,一个监听器可以被注册到多个不同的事件源上。

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.JFrame;
import javax.swing.JTextField;

public class MultiListenerTest {

    public static void main(String[] args) {

        JFrame a = new JFrame("事件处理");
        JTextField jf = new JTextField();
        a.add(jf, "South");
        MouseM m = new MouseM();

        //同一事件源上注册两个事件监听程序
        //鼠标的监听程序如点击等
        a.addMouseListener(m);

        //鼠标移动的监听程序
        a.addMouseMotionListener(m);

        a.setSize(200, 200);
        a.setVisible(true);
    }

}

class MouseM implements MouseMotionListener, MouseListener{

    @Override
    public void mouseClicked(MouseEvent e) {
        // TODO Auto-generated method stub
        System.out.println("clicked" + "x:" + e.getX() + ",y:" + e.getY());
    }

    @Override
    public void mousePressed(MouseEvent e) {
        // TODO Auto-generated method stub
        System.out.println("mousePressed");
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        // TODO Auto-generated method stub
        System.out.println("mouseRelsased");
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        // TODO Auto-generated method stub
        System.out.println("mouseEntered");
    }

    @Override
    public void mouseExited(MouseEvent e) {
        // TODO Auto-generated method stub
        System.out.println("mouseExited");
    }

    @Override
    public void mouseDragged(MouseEvent e) {
        // TODO Auto-generated method stub
        System.out.println("拖动:" + e.getPoint());
    }

    @Override
    public void mouseMoved(MouseEvent e) {
        // TODO Auto-generated method stub
        System.out.println("移动:" + e.getPoint());
    }

}

5、事件适配器(Event Adapter)

为简化编程jdk针对大多数事件监听器接口定义了相应的实现类——事件适配器类,在适配器中,实现了相应监听器接口中的所有的方法,但不做任何事情。

所以定义的监听器类可以继承事件适配器类,并只重写所需要的方法。

有如下适配器:

- ComponentAdapter (组件适配器)

- ContainerAdapter (容器适配器)

- FocusAdapter (焦点适配器)

- KeyAdapter (键盘适配器)

- MouseAdapter (鼠标适配器)

- MouseMotionAdapter (鼠标运动适配器)

- WindowAdapter (窗口适配器)

鼠标适配器示例程序:MouseListener中由多个方法,但在这里只实现了mouseClicked()

package 图形界面设计;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;

public class AdapterTest {

    public static void main(String[] args) {

        JFrame z = new JFrame("事件适配器测试");
        z.setSize(500, 400);

        MouseLS a = new MouseLS();

        //注册z上的鼠标事件处理程序,发生点击等事件执行a里的代码
        z.addMouseListener(a);
        z.setVisible(true);
        z.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

class MouseLS extends MouseAdapter{

    public void mouseClicked(MouseEvent e){

        // 打印出鼠标点击时的x点和y点的坐标
        System.out.println("鼠标点击了:" + e.getX() + "," + e.getY());
    }

}

更多java知识请关注Java基础教程栏目。

--结束END--

本文标题: java中事件图文详解

本文链接: https://www.lsjlt.com/news/1742.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • java中事件图文详解
    学习java事件之前,对java内部类、java常用组件、容器、布局管理器、java抽象窗口工具包这些东西有一定的了解,结合下面的知识点,可以做一些简单的窗口程序。(推荐:java视频教程)Java语言对事件的处理采用的是授权事件模型。在这...
    99+
    2021-10-07
    java
  • Java中继承图文详解
    java继承与合成基本概念继承:可以基于已经存在的类构造一个新类。继承已经存在的类就可以复用这些类的方法和域。在此基础上,可以添加新的方法和域,从而扩充了类的功能。合成:在新类里创建原有的对象称为合成。这种方式可以重复利用现有的代码而不更改...
    99+
    2019-09-16
    Java
  • java读取文件乱码问题图文详解
    Java读取文本文件(例如csv文件、txt文件等),遇到中文就变成乱码。(推荐:java视频教程)读取代码如下:List lines=new ArrayList(); BufferedReader br = new BufferedR...
    99+
    2022-02-05
    java
  • Java @Accessors注解图文详解
    目录前言1. @Accessors 源码2. @Accessors 属性说明2.1 fluent 属性2.2 chain 属性2.3 prefix 属性总结前言 在你的工作中,有时候...
    99+
    2023-02-03
    Accessors注解 @accessors注解
  • Java Spring IOC图文详解
    目录IOC简介耦合与内聚工厂模式发展史IoC入门案例总结IOC简介 IoC:控制反转,即Spring反向控制应用程序所需要的资源(本来在传统模式中,主控权是在类里面的,所以才叫控制反...
    99+
    2022-11-12
  • 图文详解MySQL中的主键与事务
    目录一、MySQL 主键和表字段的注释 1.主键及自增 2.表字段的注释3.多表查询二、数据库事务概述1.数据库事务特性(ACID)2.事务并发不进行事务隔离4.MySQL 数据库管理事务1)别名...
    99+
    2022-05-13
    MySQL 主键 事务 mysql数据库事务 mysql主键类型
  • Mysql文件存储图文详解
    什么是文件系统 我们知道像 InnoDB、MyIASM 这样的存储引擎都是把表存储在磁盘上的(持久化)。当我们想读取数据的时候,这些存储引擎会从文件系统中把数据读出来返回给我们, 当...
    99+
    2022-11-12
  • java常量池图文详解
    java常量池是一个经久不衰的话题,也是面试官的最爱,题目花样百出,小菜早就对常量池有所耳闻,这次好好总结一下。推荐:java视频教程jvm虚拟内存分布:程序计数器是jvm执行程序的流水线,存放一些跳转指令,这个太高深,小菜不懂。本地方法栈...
    99+
    2016-07-05
    java
  • JAVA module-info.java文件详解
    目录JAVA module-info.java文件Java9module-info.java什么意思JAVA module-info.java文件 Java9 module-info...
    99+
    2022-11-13
  • Java文件读写详解
    目录读取文件写入文件复制文件删除文件总结读取文件 Java 中可以使用 FileInputStream 和 FileReader 两个类来读取文件: FileInputStream ...
    99+
    2023-05-20
    Java 文件读写 Java 读取文件 Java 文件的读和写
  • Java环形链表(图文详解)
    目录 一、判断链表中是否有环 (1)题目描述 (2)题解 二、环形链表的入环节点 (1)题目描述 (2)题解 一、判断链表中是否有环 (1)题目描述 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通...
    99+
    2023-09-30
    java 链表 数据结构 算法
  • java排序算法图文详解
    目录一、直接插入排序二、 希尔排序三、冒泡排序四、快速排序五、选择排序(Selection Sort)六、堆排序一、堆排序的基本思想是:二、代码示例七、归并排序总结一、直接插入排序 ...
    99+
    2022-11-12
  • Java内存模型图文详解
    1. 概述多任务和高并发是衡量一台计算机处理器的能力重要指标之一。一般衡量一个服务器性能的高低好坏,使用每秒事务处理数(Transactions Per Second,TPS)这个指标比较能说明问题,它代表着一秒内服务器平均能响应的请求数,...
    99+
    2014-08-03
    Java
  • Java RMI图文详解(附示例)
    Java RMI:Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。它使客户机上运行的程序可以调用远程服务器上的对象。远程...
    99+
    2020-09-30
    Java
  • Java泛型详解,史上最全图文详解
    泛型在java中有很重要的地位,无论是开源框架还是JDK源码都能看到它。 毫不夸张的说,泛型是通用设计上必不可少的元素,所以真正理解与正确使用泛型,是一门必修课。 一:泛型本质 Java 泛型(generics)是 JDK 5 中引入的一...
    99+
    2023-08-17
    java 开发语言 后端
  • 图文详解Java中的序列化机制
    目录概述对象序列化和反序列化机制修改默认的序列化机制使用transient关键字自定义readObject、writeObject方法实现Externalizable接口serial...
    99+
    2022-11-13
  • Java中常用的日期类图文详解
    目录前言Date为什么Date的大部分方法被弃用注释翻译目前可用方法的测试示例可用方法示例Date小结Calendar简单介绍常用的方法获取实例获取日期里的信息日期的加减与滚动日期的...
    99+
    2022-11-13
    java定义日期类 JAVA定义一个日期类 java的date类
  • MySQL之my.cnf配置文件图文详解
    目录引言问题1.mysql.server,mysqld,mysqld_safe的区别mysql.servermysql_safe问题2.mysql的三种启动方式:问题3.socket...
    99+
    2022-11-13
  • 图文详解vue中proto文件的函数调用
    1、编译proto 在src文件夹下新建proto文件夹用以存放所有的.proto文件。在proto文件夹下打开终端,输入如下命令: //进入proto文件夹执行下列编译,将he...
    99+
    2022-11-12
  • 图文详解Python中模块或py文件导入(超详细!)
    目录一、前言二、python项目中导入模块(py文件)的几种方式1、直接将py文件放到默认的库位置(特点:高效)2、将文件放到创建的库位置(特点:方便管理)3、将模块(模块包含很多p...
    99+
    2023-05-16
    Python模块或py文件导入 python如何导入py文件 python怎么导入自己写的模块
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作