侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

java中事件图文详解

Java  /  管理员 发布于 8年前   165

学习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基础教程栏目。

以上就是java中事件图文详解的详细内容,更多请关注其它相关文章!


  • 上一条:
    深入理解java中反射机制(含数组参数)
    下一条:
    Java中对Socket设置超时时间
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在java中实现的脱敏工具类代码示例分享(0个评论)
    • zookeeper安装流程步骤(0个评论)
    • 在java中你背的“八股文”可能已经过时了(2个评论)
    • 在php8.0+版本中使用属性来增加值代码示例(3个评论)
    • java 正则表达式基础,实例学习资料收集大全 原创(0个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-11
    • 2018-03
    • 2020-03
    • 2023-05
    • 2023-11
    • 2024-01
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客