内容概要:
1.委托事件模型
2.动作事件
3.窗口事件
4.适配器类
5.各种事件及其处理
1.委托事件模型
事件是用户的某个动作触发的事件。事件(Event)用Event类来表示。同时,我们将产生事件的组件对象,称为事件源(Event Source)。事件源若产生了某个事件,它就会将该事件传递给事件监听者(Event Listener),然后,由事件监听者对接收的事件进行处理。
事件(对象):用户在组件中触发事件对象。
事件源:产生事件的组件
事件监听者:处理事件的对象。
事件源产生某种事件时,不会直接对该事件进行处理,他会将该事件的处理工作委托给某个事件监听者。我们将这种事件处理模型称为委托事件模型(delegation模型)
AWT组件上发生的时间对象的最终父类都是Event Object类,所以,所有事件类都继承了Event Object类。该类的getSource()方法用于获取事件源对象,它在跟踪时间发生组件时调用使用。
public Object getSource()——返回事件源对象。
getSource()方法返回Object型组件,所以调用该方法时,必须进行必要的类型转换。
Object com=event.getSource();..........//com事件源
if(com instanceof TextField){......................//若com为TextField对象
TextField tf=(TextField)com;......................//将com转换为TextField对象
}
A instanceof B:若A为类B的对象,返回true,否则,返回false。
常用的事件及事件监听者
1.动作事件(ActionEvent):ActionListener
2.鼠标事件(MouseEvent):MouseListener
3.焦点事件(FocusEvent):FocusListener
要使用事件类与事件监听接口,必须引入java.awt.event包,它包含有与AWT事件相关的类。
2.动作事件(ActionEvent)
动作事件对应于组件的主要用途。点击按钮,选择菜单项,或输入字符串并敲击Enter键时都会发生动作事件。在Java中动作事件由ActionEvent类表示。
ActionEvent类的常用方法
public String getActionCommand()——获取事件源的动作命令(actionCommand)字符串。
一般的,动作命令字符串是显示按钮或单行文本框的字符类。与动作事件相对应的事件处理接口为ActionListener接口。
ActionListener接口的所有抽象方法
public String getActionCommand()——接口动作事件,然后进行某种处理
倘若接收了某种事件,ActionListener()方法会被自动调用执行。形式参数e引用传递过来的动作事件对象。
让我们一起来创建ActionListener接口对象。首先,要如下定义了ActionListener接口的类ActionHandler。
class ActionHandler implements ActionListener{ public void actionPerformed(ActionEvent e){ //在此处,添加处理动作事件的代码。 } }
然后,创建ActionHandler类对象:
ActionListener ac=new ActionListener();
此处的ac即成为了动作事件监听接口的对象。若想将事件源产生的动作事件传递给ac,必须首先向事件源注册动作事件者对象(ac)。例如,Button类的addActionListener()方法就用于向按钮对象注册动作事件监听者对象。
Button button=new Button("确认");
button.addActionListener(ac); //将ac注册给button对象。
将动作事件监听对象注册给按钮(事件源)后,所有有关事件处理的工作就结束了。接下来要做的就是运行程序,看结果.
进行事件处理所遵循的步骤,总结如下:
1.定义实现事件监听接口的类。
2.创建时间监听者对象。
3.想事件源注册监听者对象。
import java.awt.*; import java.awt.event.*; public class ActionEvent2 extends Frame implements ActionListener { TextField tf; public ActionEvent2(String title){............................//构造函数 super(title); tf=new TextField(20); tf.addActionListener(this);........................//this也是一个Frame,也是动作事件监听者对象。 add(tf); } public void actionPerformed(ActionEvent e) {...................//覆盖 if(e.getSource() instanceof TextField){ TextField temp=(TextField)e.getSource();.......................//获取事件源对象 System.out.println(temp.getText());............................//输出temp中的字符串 temp.setText("");............................................//清空temp中的字符串 }} public static void main(String[] args) { ActionEvent2 me=new ActionEvent2("动作事件处理"); me.pack(); me.setVisible(true); }} //使用单行文本框接收用户的输入,并在用户敲击Enter键后,将接收的字符串输出来。
3.窗口事件(WindowEvent)
窗口事件(WindowEvent)是在窗口对象上发生的事件。处理该事件的接口时WindowListener接口。
WindowEvent类的常用方法
public Window getWindow()——返回产生事件的窗口。
WindowListener接口的所有方法
public void windowActivated(WindowEvent e)——窗口被激活时调用的方法
public void windowClosed (WindowEvent e)——窗口被完全关闭时调用的方法。
public void windowClosing (WindowEvent e)——用户点击关闭按钮时调用的方法。
public void windowDeactivated (WindowEvent e)——窗口失去活性时调用的方法。
public void windowIconified (WindowEvent e)——窗口被最小化时调用的方法。
public void windowDeiconified (WindowEvent e)——窗口被从最小化还原时调用的方法。
public void windowOpened(WindowEvent e)——窗口被打开时调用的方法。
在将窗口事件监听对象注册给窗口时,要使用addWindowListener()方法。
4.适配器类(Adapter)
实现WindowListener接口时,必须实现像windowActived(),windowOpened()这样的不需要的方法。这样即繁琐又耗时,Java引入了适配器用于解决此类问题。
大部分监听接口都存在相应的适配器类,每个适配器都实现了响应的监听接口。但是,适配器中所存方法的方法体都是空实现。eg:WindowAdapter实现了WindowListener接口,它的所有方法都是空实现。
于是,继承了WindowAdapter的类自然地拥有了WindowListener的所有方法,我们只需要覆盖所需要的方法即可。但是,由于Java只支持单重继承,所以,倘若某个类继承了WindowAdapter类,它就无法再继承其他的类了。
下面实例使用WindowAdapter类,创建匿名类来进行事件处理。
public class WindowEvent3 extends Frame{ public WindowEvent3(){..................................//构造函数 setTitle("关闭窗口事件的处理"); WindowListener winHandler=new WindowAdapter(){ public void windowClosing(WindowEvent e){ CloseFrameDialog d=new CloseFrameDialog(WindowEvent3.this,“关闭”,“确实要关闭吗?”); d.setSize(200,100); d.setVisible(true); }};......................................................//注意分号 addWindowListener(winHandler);.....................//注册监听事件 } public static void main(String[] args){ WindowEvent2 me=new WindowEvent2(); me.setSize(200,100); me.setVisible(true); }}
5.各种事件及其处理
1)文本事件(TextEvent)及其处理
文本文件时文本组件(TextField或TextArea)的字符串发生改变时产生的事件。动作事件ActionEvent是在TextField中输入文本,并按下Enter键之后发生的时间,而文本事件(TextField)是每当向TextFeild输入字符串是就要发生的事件。所以,当需要对文本组件的字符串进行检查时,就可以使用它。
与AcitonEvent相对应的监听接口时TextListener接口,此接口只有一个方法。
public void textValueChanged(TextEvent e)——文本组件的字符串发生改变时调用的方法。
eg:
public class TextEvent1 extends Frame { Label text; Label length; TextField tf; public TextEvent1(String title){.............................//构造函数 super(title); setLayout(new GridLayout(3,1)); text=new Label("字符串"); length=new Label("字符个数:0"); tf=new TextField(); add(text); add(length); add(tf); tf.addTextListener(new TextHandler());.....................//注册监听接口对象。 } public static void main(String[] args){ TextEvent1 f=new TextEvent1("文本事件处理"); f.setSize(200,200); f.setVisible(true); } class TextHandler implements TextListener{..........................//处理文本事件的类 public void textValueChanged(TextEvent e){ text.setText("字符串:"+tf.getText()); length.setText("字符数:"+tf.getText().length()); }}}
输入事件(InputEvent)抽象类
输入事件类是一个抽象类,它是由键盘或鼠标等输入设备触发的事件的事件的父类。把包括两个子类:KeyEvent类或MouseEvent类。InputEvent类提供了用于侦测Shift或Alt键状态的方法。
InputEvent类的常用方法
public long getWhen()——获取InputEvent事件发生的事件。
public boolean isAltDown()——获取Alt键的状态,若Alt键被按下,则返回true,否则,返回false。
public boolean isShiftDown()——获取Shift键的状态,若Alt键被按下,则返回true,否则,返回false。
public boolean isControlDown()——获取Ctrl键的状态,若Alt键被按下,则返回true,否则,返回false。
2)键盘事件(KeyEvent)及其处理
键盘事件(KeyEvent)继承了输入事件(InputEvent),它是与键盘有关的事件。与键盘相对应的处理接口为KeyListener,并且向组件注册监听接口的方法为addKeyListener()。只有组件拥有了焦点,KeyEvent事件才能发生。
KeyEvent类的常用方法
public char getKeyChar()——获取产生键盘事件的键面字符。eg:若安息“Shift+A”,则返回A。
public int getKeyCode()——获取引发事件的键码值(KeyCode)
public static String getKeyText(int keyText)——获取指定键码值的键所对应的文本(KeyText)。eg:“Home”、“F1”。
public boolean isActionKey()——引发事件的键若为动作键(ActionKey)、则返回true,否则,返回false。
KeyEvent接口的方法
public void keyPressed(KeyEvent e);——键按下时被调用。
public void keyRelesed(KeyEvent e);——释放键时被调用。
public void keTyped(KeyEvent e);——击键一次时被调用。
KeyListener接口的适配器类是KeyAdapter。所以,只要继承了KeyAdapter类,就可以创建处理KeyEvent的类。同时,由于keyEvent继承了InputEvent事件,所以它自然就拥有了isShiftDown(),isAltDown(),isControlDown()方法,也就可以区分“Shift+A”与“Shift+Ctrl+A”等键。
eg:
import java.awt.*; import java.awt.event.*; public class KeyEvent2 extends Frame{ Label info; TextField tf; public KeyEvent2(String title){ super(title); setLayout(new GridLayout(2,1)); info=new Label("key键信息:");..................//显示key信息的标签 tf=new TextField();............................//key事件源TextField add(info); add(tf); tf.addKeyListener(new KeyHandler());..........//注册监听事件对象 } public static void main(String[] args){ KeyEvent2 me=new KeyEvent2("Key事件处理"); me.setSize(200,200); me.setVisible(true); } class KeyHandler extends KeyAdapter{...........//继承KeyAdapter类 public void keyPressed(KeyEvent e){ String k=""; if(e.isShiftDown()) k="Shift+"; if(e.isAltDown()) k+="Alt+"; if(e.isControlDown()) k+="Ctrl+"; k+=e.getKeyText(e.getKeyCode()); info.setText("key键信息:"+k); }}}
3)鼠标事件(MouseEvent)及其处理
鼠标事件(MouseEvent)是用户使用鼠标在某个组件上进行某种处理时发生的动作。
MouseEvent类的常用方法
public int getButton()——获取按钮常数,按钮常数如下:
NOBUTTON(=0),BUTTON1(=1),BUTTON2(=2),BUTTON3(=3)
public Point getPoint()——以Point对象形式,返回鼠标坐标。
public int getX(),public int getY()——获取鼠标的x坐标和y坐标。
与MouseEvent相对应的鼠标事件监听接口为MouseListener和MouseMotionListener。MouseListener接口处理鼠标的静态事件,MouseMotionListener处理鼠标的移动事件。
MouseListener接口的方法
public void mouseClicked(MouseEvent e)——鼠标被点击时,调用的方法。
public void mousePressed(MouseEvent e)——鼠标被按下时,调用的方法。
public void mouseReleased(MouseEvent e)——鼠标被按下的状态中释放时调用方法。
public void mouseEntered(MouseEvent e)——鼠标进入组件时调用方法。
public void mouseExited(MouseEvent e)——鼠标移出时调用方法。
mouseClicked事件发生时,将发生一连串事件,发生顺序如下:momouseEntered→mousePressed→mouseReleased→mouseClicked
MouseMotionListener接口的方法
public void mouseMoved(MouseEvent e)——在鼠标键未被按下的状态下,移动鼠标时调用的方法。
public void mouseDreagged(MouseEvent e)——在鼠标被按下的状态下,移动鼠标时调用的方法。
4)项目事件(ItemEvent)及其处理
项目事件是在具有选择某个项目功能的组件上发生的事件。如选中列表框或下拉菜单的项目时,就会发生ItemEvent事件。ItemEvent事件是在实现ItemSelectable接口的类上发生的事件。表框和下拉菜单,复选框都实现了ItemSelectable接口。
ItemEvent类的常用方法
public Object getItem()——获取发生ItemEvent事件的项目(以Object类型返回)。
public ItemSelectable getItemSelectable()——获取发生ItemEvent事件的组件。
public int getStateChange()——获取选择的状态,返回下列状态之一。SELECTED(选中状态),EDSELECTED(未选中状态)。
ItemEvent接口的方法
void itemStateChanged(ItemEvent e);——项目状态发生改变时调用方法。
5)AdjustmentEvent事件及其处理
AdjustmEvent事件是在实现了Adjustable接口的对象上发生的事件,如Scrollbar和ScrollPane上滚动值发生改变时,就会发生AdjustmentEvent事件。
AdjustmentEvent类常用方法
public Adjustable getAdjustable()——获取发生事件的组件(Adjustable对象)。
public int getAdjustmentType()——获取滚动的状态。
public int getValue()——获取组件的当前值。
AdjustmentListener接口的方法
public void adjustmentValueChanged(AdjustmentEvent e);——滚动值发生了改变时,被调用的方法。
6)焦点事件(FocusEvent)及其处理
若程序页面上有多个单行文本框,每次只能在一个组件上接受键盘输入。并且接受键盘输入的组件拥有焦点,当鼠标转向另外一个TextField,曾有的焦点会失去焦点,焦点被鼠标新选中的单行文本框所占有。在某个组件获取或失去焦点时发生的事件即为FocusEvent事件。所有的组件都能产生FocunEvent事件。
FocusEvent类的常用方法
public boolean isTemporary()——若焦点的变化时暂时性的,返回true,若是长久性的,返回false。
在某个窗口失去活性,其内拥有的焦点会暂时失去焦点,它被重新激活时,组件重新获得焦点,这种焦点的变化称为暂时性的变化。如此相反,失去焦点的组件由于用户或程序有意不给其焦点而导致其永远无法拥有焦点的变化,称为长久性变化。
FocusListener接口的方法
public void focusGained(FocusEvent e)——组建获得Focus后,被调用的方法。
public void focusLost(FocusEvent e)——组建失去Focus后,被调用的方法。
7)多事件处理
TextField上可以发生几种事件呢?可以发生ActionEvent,TextEvent,FocusEvent,KeyEvent,MouseEvent等事件,还可以发生更多的事件。
若ABC用于处理ActionEvent事件,它可以定义如下:
class ABC implements ActionListener{ public void actionPerformed(ActionEvent e){。。。} }
然而,若类ABC还想处理其他事件(如TextEvent事件),那么它可以在实现其他接口就可以了,Java支持实现多个接口。
class ABC implements ActionListener,TextListener{ public void actionPerformed(ActionEvent e){。。。} public void textValueChanged(ActionEvent e){。。。} }
如此一来,ABC类实现了ActionListener接口,又实现了TextListener接口,可以处理ActionEvent事件,又可以处理TextEvent事件。
问题思考
转载请注明: ITTXX.CN--分享互联网 » Java语言学习—第十六章 AWT事件处理机制[Java基础]
最后更新:2018-10-15 00:22:30