扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
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为顶层和类,按事件的类型构成了一个树形结构。
具体见下图:
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中的事件就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流