javaSwing事件监听.docx
《javaSwing事件监听.docx》由会员分享,可在线阅读,更多相关《javaSwing事件监听.docx(14页珍藏版)》请在冰点文库上搜索。
![javaSwing事件监听.docx](https://file1.bingdoc.com/fileroot1/2023-5/3/763d72f7-d5b5-43de-b7d5-d281a683b400/763d72f7-d5b5-43de-b7d5-d281a683b4001.gif)
javaSwing事件监听
1事件处理
对于采用了图形用户界面的程序来说,事件控制是非常重要的;
到目前为止,我们编写的图形用户界面程序都仅仅只是完成了界面,而没有任何实际的功能,要实现相应的功能,必须进行事件处理;
用户与GUI组件进行交互就会发生事件,如:
按下一个按钮、用键盘输入一个字符、点击鼠标等等;
当前我们要关注的并不是“事件是如何产生的”,而是讨论当发生事件后,我们应当“如何处理之”。
事件处理模型
Java中,事件处理的基本思路如下:
一个源(事件源)产生一个事件(事件对象)并把它送到监听器那里,监听器只是简单地等待,直到它收到一个事件,一旦事件被接受,监听器将处理这些事件;
一个事件源必须注册监听器以便监听器可以接受关于一个特定事件的通知。
当在一个图形用户界面点击鼠标或者按下键盘时,都是针对于具体组件而发生的动作,如:
使用鼠标点击某个按钮;按下键盘向文本框输入内容等等;
我们把动作所操纵的对象称为事件源,请注意:
事件源一定是指某个组件;
当针对于事件源发生动作时,就会产生一个事件。
针对每一类型的事件,都有与之相对应的监听器,用于监听事件的发生;
在Java中,监听器由一系列接口来提供;
实际上,事件监听器就是实现了事件监听接口的类,监听器不断监听事件源的动作,当事件源产生一个事件后,监听器接收到事件源的通知,就调用特定的方法,以执行指定的动作。
特定的事件监听器只对特定的事件感兴趣。
java.awt.event包中包含了一系列与事件处理相关的类和接口,其中包括:
监听器接口,事件对象和事件适配器等;
一般来说,编写图形用户界面程序都必须显式地导入此包;
每种事件监听器接口都是以类似于
XxxListener
的形式来命名的,如:
ActionListener、MouseListener、ItemListener等;
ActionListener接口
按钮被点击是图形编程中最普遍的事件,我们经常要处理;
ActionListener被称为活动监听器,一般用来监听按钮的点击事件;
该接口中包含有一个抽象方法,原型如下:
publicvoidactionPerformed(ActionEventae);
实现该监听器接口必须重写上面的方法。
案例1:
按钮点击
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
publicclassEventDemoextendsJFrame{
privateJLabellblMsg;
privateJButtonbtnClick;
publicEventDemo(){
lblMsg=newJLabel("请点击下面的按钮...");
btnClick=newJButton("请点击我");
ContainercpMe=getContentPane();
cpMe.setLayout(newBorderLayout());
cpMe.add(lblMsg,BorderLayout.CENTER);
cpMe.add(btnClick,BorderLayout.SOUTH);
setTitle("ActionListenerDemo");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(300,200);
setResizable(false);//设置不允许用户自行调整窗口大小
setVisible(true);
}
publicstaticvoidmain(String[]args){
newEventDemo();
}
}
事件处理步骤1:
确定事件源及监听器类型
由于我们想要处理按钮的点击事件,因此,按钮便是事件源;
监听器类型是ActionListener。
编写类来实现监听器接口,并重写其中的抽象方法,如:
classMyListenerimplementsActionListener{
publicvoidactionPerformed(ActionEventae){
……
}
}
事实上,我们重写的这个抽象方法就是事件处理函数。
也就是说,当事件发生时,这个方法将自动调用,其中的代码将被执行;
但是,为了方便成员间的相互访问,我们一般采用内部类的方式来实现监听器
事件处理步骤2:
实现监听器接口(代码)
importjava.awt.*;
importjava.awt.event.*;//要进行事件处理,必须导入此包
importjavax.swing.*;
publicclassEventDemoextendsJFrame{
privateJLabellblMsg;
privateJButtonbtnClick;
publicEventDemo(){//构造方法,代码略
……
……
}
/*采用内部类的方式实现监听器接口*/
privateclassMyListenerimplementsActionListener{
/*实现接口中的抽象方法,事件发生时,将自动调用此方法*/
publicvoidactionPerformed(ActionEventae){
lblMsg.setText("我被点击了!
");//设置标签中的文本
}
}
publicstaticvoidmain(String[]args){
newEventDemo();
}
}
事件处理步骤3:
事件源注册监听器
最后,我们要将事件源注册到监听器,也就是说,必须委派监听器去监听事件源所发生的事件;
每种类型的事件都有其自己的注册方法,一般形式为:
voidaddXxxListener(XxxListenerlistener);
这里的Xxx指代具体的事件类型,而listener则是相应类型的监听器实例;
一般会采用如下形式将事件源注册到监听器:
事件源.addXxxListener(监听器实例);
如:
btnClick.addActionListener(newMyListener());
事件处理步骤3:
事件源注册监听器(代码)
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
publicclassEventDemoextendsJFrame{
privateJLabellblMsg;
privateJButtonbtnClick;
publicEventDemo(){//构造方法,代码略
……
btnClick.addActionListener(newMyListener());//将事件源注册到监听器
……
}
/*内部类实现监听器接口*/
privateclassMyListenerimplementsActionListener{
publicvoidactionPerformed(ActionEventae){//实现事件处理函数
lblMsg.setText("我被点击了!
");
}
}
publicstaticvoidmain(String[]args){
newEventDemo();
}
}
事件的类型
实际上,事件是区分类型的,如:
操作鼠标时会产生鼠标事件,使用键盘输入字符时会产生键盘事件,窗体打开或关闭时会产生窗体事件等等;
对于不同类型的事件会有不同类型的监听器与之对应;
java.awt.event包中包含了一系列监听器接口,分别用来处理不同类型的事件。
AWT事件类的继承体系
AWT事件类型(列表)
常用监听器1:
ActionListener
ActionListener可能是使用得最多的监听器,与之对应的事件类型是ActionEvent,一般在鼠标点击某个按钮时会产生该事件;
该接口只包含有一个抽象方法,其原型如下:
publicinterfaceActionListener
{
publicvoidactionPerformed(ActionEventae);
}
其实现类必须重写actionPerformed方法,当事件发生时将调用该方法。
KeyListener专门用来处理键盘事件,其对应事件类型是KeyEvent;
该接口中包含有三个抽象方法,分别在不同的时刻被调用,原型如下:
publicinterfaceKeyListener
{
/*按下键盘上的某键时调用*/
publicvoidkeyPressed(keyEventke);
/*释放键盘上的某键时调用*/
publicvoidkeyReleased(KeyEventke);
/*输入某个字符时调用*/
publicvoidkeyTyped(KeyEventke);
}
操作鼠标时会产生鼠标事件MouseEvent,而MouseListener用来处理鼠标的动作,其原型:
publicinterfaceMouseListener{
/*鼠标按钮在某个组件上按下时调用*/
publicvoidmousePressed(MouseEventme);
/*鼠标按钮在某个组件上释放时调用*/
publicvoidmouseReleased(MouseEventme);
/*鼠标按钮在某个组件上点击(按下并释放)时调用*/
publicvoidmouseClicked(MouseEventme);
/*鼠标进入到某个组件的范围之内时调用*/
publicvoidmouseEntered(MouseEventme);
/*鼠标离开某个组件的范围之外时调用*/
publicvoidmouseExited(MouseEventme);
}
MouseMotionListener是专门处理鼠标运动事件的,比如将鼠标进行移动和拖动的时候,该接口的原型如下:
publicinterfaceMouseMotionListener
{
/*在某个组件上移动鼠标时调用*/
publicvoidmouseMoved(MouseEventme);
/*在某个组件上拖动(按下键并移动)鼠标时调用*/
publicvoidmouseDragged(MouseEventme);
}
对于象下拉列表、单选按钮、复选按钮这些有选项的组件而言,当它们的选项发生改变的时候,都会产生选项事件ItemEvent,如果需要处理这样的事件,就用到了ItemListener,其原型:
publicinterfaceItemListener
{
/*当选项的状态(选择或取消)发生改变时调用*/
publicvoiditemStateChanged(ItemEventie);
}
操作窗口时会产生窗口事件WindowEvent,其对应监听器是WindowListener,原型如下:
publicinterfaceWindowListener{
/*窗口被激活时调用*/
publicvoidwindowActivated(WindowEventwe);
/*窗口被禁止时调用*/
publicvoidwindowDeactivated(WindowEventwe);
/*窗口被关闭时调用*/
publicvoidwindowClosed(WindowEventwe);
/*窗口正在关闭时调用*/
publicvoidwindowClosing(WindowEventwe);
/*窗口最小化时调用*/
publicvoidwindowIconified(WindowEventwe);
/*窗口恢复时调用*/
publicvoidwindowDeiconified(WindowEventwe);
/*窗口打开时调用*/
publicvoidwindowOpened(WindowEventwe);
}
常用监听器7:
FocusListener
某个组件得到/丢失焦点时将产生焦点事件FocusEvent,可以使用FocusListener来处理这样的事件,该接口原型:
publicinterfaceFocusListener
{
/*某个组件获得焦点时调用*/
publicvoidfocusGained(FocusEventfe);
/*某个组件失去焦点时调用*/
publicvoidfocusLost(FocusEventfe);
}
案例2:
鼠标运动
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
publicclassMouseMotionDemoextendsJFrame{
privateJLabellblN;//放置在北边的标签
privateJLabellblS;//放置在南边的标签
publicMouseMotionDemo(){
lblN=newJLabel("请移动鼠标");
lblS=newJLabel("请拖动鼠标");
ContainercpMe=this.getContentPane();
cpMe.setLayout(newBorderLayout());
cpMe.add(lblN,BorderLayout.NORTH);
cpMe.add(lblS,BorderLayout.SOUTH);
this.setTitle("MouseMotionListenerDemo");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(600,400);
this.setVisible(true);
}
publicstaticvoidmain(String[]args){
newMouseMotionDemo();
}
}
步骤1:
确定事件源及监听器类型
我们要处理的是鼠标在窗体上移动/拖动时产生的事件,因此,窗体是事件源;
监听器类型是MouseMotionListener。
步骤2:
实现监听器接口
publicclassMouseMotionDemoextendsJFrame{
privateJLabellblN;
privateJLabellblS;
publicMouseMotionDemo(){//构造方法,代码略
……
}
/*内部类实现监听器接口*/
privateclassMyListenerimplementsMouseMotionListener{
/*接口中的抽象方法,必须实现,当鼠标移动时自动调用此方法*/
publicvoidmouseMoved(MouseEventme){
……
}
/*接口中的抽象方法,必须实现,当鼠标拖动时自动调用此方法*/
publicvoidmouseDragged(MouseEventme){
……
}
}
publicstaticvoidmain(String[]args){
newMouseMotionDemo();
}
}
事件对象
Java中的所有事件都被封装在事件对象中,所有事件对象皆派生自EventObject类;
对于不同的事件类型会有不同的事件对象,它们都以类似于XxxEvent的方式命名,如:
ActionEvent、MouseEvent等等;
事件对象中包含有事件发生时的相关信息(即事件触发时产生的一些数据),会被事件底层机制传递到事件处理函数中;
实际上事件对象就是事件处理函数中被传递进来的参数,如果在处理事件的过程中需要使用到相关的某些数据,可以从事件对象中获取。
java.awt.event.MouseEvent的常用方法
事件处理代码
/*内部类实现监听器接口*/
privateclassMyListenerimplementsMouseMotionListener{
/*接口中的抽象方法,必须实现,当鼠标移动时自动调用此方法*/
publicvoidmouseMoved(MouseEventme){
intx=me.getX();//得到鼠标位置的x坐标
inty=me.getY();//得到鼠标位置的y坐标
//将鼠标坐标信息显示到北边的标签中
Stringstr="正在移动鼠标X:
"+x+",Y:
"+y;
lblN.setText(str);
}//事件对象
/*接口中的抽象方法,必须实现,当鼠标拖动时自动调用此方法*/
publicvoidmouseDragged(MouseEventme){
intx=me.getX();//得到鼠标位置的x坐标
inty=e.getY();//得到鼠标位置的y坐标
//将鼠标坐标信息显示到南边的标签中
Stringstr="正在拖动鼠标X:
"+x+",Y:
"+y;
lblS.setText(str);
}
}
步骤3:
事件源注册监听器
publicclassMouseMotionDemoextendsJFrame{
privateJLabellblN;
privateJLabellblS;
publicMouseMotionDemo(){//构造方法
……
//将窗体注册到鼠标运动监听器
this.addMouseMotionListener(newMyListener());
……
}
/*内部类实现监听器接口,代码略*/
privateclassMyListenerimplementsMouseMotionListener{
……
……
}
publicstaticvoidmain(String[]args){
newMouseMotionDemo();
}
}
与事件处理相关的三个概念:
事件源、监听器、事件对象;
在程序中要进行事件处理的话,需要导入java.awt.event包;
事件处理的三个步骤:
–确定事件源和监听器类型
–实现监听器接口
–将事件源注册到监听器
事件处理的三种语法实现形式:
–内部类的实现方式
–匿名类的实现方式
–直接实现的方式