1、构件的事件
存在两种类型的AWT事件,即扩展Component的构件事件和扩展AWTEvent的语义事件
当一个构件中发生某件事时,激发构件事件。构件事件可以分为输入事件和无输入事件,鼠标和键盘事件是输入事件。输人事件和无输人事件的区别在于输入事件可以被消耗掉,被消耗的事件将不会传给构件的同位体。
语义事件 | 构件事件 |
ActionEvent | ComponentEvent |
AdjustmentEvent | ContainerEvent |
ItemEvent | FocusEvent |
TextEvent | InputEvent |
KeyEvent | |
MouseEvent | |
MouseMotionEvent | |
WindowEvent |
语义事件不像构件事件这么具体,不一定非要由单击鼠标这样的基本动作来触发。
1.1 构件与容器事件/ComponentEvent与ContainerEvent
- 只要显示、隐藏、重设大小或移动一个构件,构件就向所有已注册的构件监听者激发ComponentEvent事件。除了激发构件事件外
- 当向容器中添加构件或从容器中移出构件时,还会激发容器事件。
- 只有在构件中调用Component . setvisible ()(或不赞成的show () /hide ())方法时,才会激发显示或隐藏该构件的构件事件。例如,如果applet的窗口暂时被隐藏在另一个窗口后面,那么当隐藏或显示applet 时,applet中包含的构件将不会激发ComponentEvent事件。
1.2 焦点事件/FocusEvent
- 在任何时刻,每个窗口系统中都至多存在一个具有键盘焦点的构件。当构件具有焦点时,把键盘事件传送给要处理的构件。
- 和其他构件相比,具有键盘焦点的构件有其显著特征。例如,窗口中具有键盘焦点的按钮的边框内有一虚线矩形。
- AWT构件可以通过下面的三种方法获得焦点:
- 1)与构件相互作用。
- 2)调用Component . focusRequested ()。
- 3)用TAB 和 SHIFT-TAB组合键移动键盘焦点。
- 焦点事件被描述为FOCUS_ LOST 或 FOCUS_CAINED事件。FOCUS_ LOST事件更进一步被描述为临时性焦点事件和持久性焦点事件。
- 当把键盘焦点有意地传给一个给定的 applet或应用程序中的构件时,激发持久性焦点事件。原来具有焦点的构件激发一个FOCUS_ LOST事件,然后得到焦点的构件激发一个FOCUS_GAINED 事件。
1.3 键盘事件/KeyEvent
在具有键盘焦点的构件中按下或释放按键时,将会激发键盘事件。一共存在三种类型的键盘事件,每一种都被封装在java . awt . event .KeyEvent类中。在KeyListener接口中,每一种事件都用一个常量和一个相应的方法表示。
事件标志 | KeyListener | 激发条件 |
KEY_PRESSED | KeyPressed(KeyEvent) | 按下按键 |
KEY_RELEASED | KeyReleased(KeyEvent) | 释放按键 |
KEY_TYPED | KeyTyped(KeyEvent) | 按下键盘字符 |
1.4 鼠标和鼠标移动事件/MouseEvent与MouseMotionEvent
- 与继承事件模型不一样,授权事件模型区分鼠标事件和鼠标移动事件的办法是为它们提供不同的监听者:MouseListener和MouseMotionListener。
- 鼠标移动和鼠标拖动事件都是鼠标移动事件,而所有其他的鼠标事件(进入/退出、按下/释放、单击)都是简单的鼠标事件。当按下鼠标以后迅速释放时(在这过程中没有拖动鼠标),将激发一个鼠标单击事件。
- 与键盘事件一样,鼠标事件也是输入事件,因此也是可以消耗的
1.5 窗口事件/WindowEvent
只有 java.awt . Window(和它的扩展类)的实例,才能激发窗口事件。窗口事件表示窗口处于激活状态/无效状态、图标状态/非图标状态、打开/关闭或正在关闭过程中。
1.6 画布和面板的焦点和键盘事件
虽然所有的构件都能够激发焦点和键盘事件,但为了实现这一点,构件必须具有键盘焦点。默认情况下认为,画布和面板对获得键盘焦点没有很大兴趣,因此不会激发键盘或焦点事件。为了处理画布和面板的键盘和焦点事件,必须调用要处理的画布或面板中的requestFocus()方法。一旦画布或面板具有键盘焦点,将激发键盘和焦点事件。
1.7 消耗输入事件
- 很多时候,我们可以很方便地阻止事件传递到构件的同位体。例如,GUI生成器通常具有生成模式和测试模式。在生成模式中,希望能取消通常的对单击按钮或敲击键盘的响应,提供一份适当的表格。然而在测试模式中,构件应该是有实用性的。
- 授权事件模型允许消耗输人事件(即键盘和鼠标事件),事件一旦被消耗了,就不能传给它的本地同位体。InputEvent类提供了一个consume方法,可以用来消耗斐处理的事件。
public void mousePressed(MouseEvent event){
……
event.consume();
}
与大多数事件的监听者不一样,在输人事件被传给构件的同位体以前通知输入事件的监听者。如果通过InputEvent.consume ()
消耗事件,那么将不会把方法传给构件的同位体,而是仍然传给所有已经注册的适当类型的监听者。例如,对于按钮,意味着鼠标按下事件的消耗取消了通常对鼠标按下的响应,但是鼠标按下事件仍然被传给按钮的所有已注册的鼠标监听者。
2、语义事件
- 语义事件不等同于任何单个的构件事件,而是描述一个由多个构件事件组成的事件。与构件事件相反,语义事件总是被消耗掉,因此它不能传给构件的同位体。例如,如果移动鼠标(鼠标移动)进入一个按钮(鼠标进人),按下鼠标按钮〈鼠标按下),然后在按钮内释放鼠标(鼠标单击),按钮将激发动作事件。
- 处理语义事件和处理构件输入有着同样的模式。
语义事件 | 激发构件 | 激发条件 |
ActionEvent | 按钮 | 激活按钮 |
列表 | 双击项目 | |
菜单项 | 选定项目 | |
文本框 | 在域中回车 | |
AdjustmentEvent | 滚动条 | 移动滑块 |
ItemEvent | 复选框 | 切换复选框 |
复仙框菜单项 | 选定菜单项 | |
选择框 | 选定项目 | |
列表 | 选定项目 | |
TextEvent | 文本构件 | 改变文本 |
2.1 动作事件
动作事件由上表列出的所有构件激发。
2.2 可调事件
- 可调事件由实现Adjustable接口的类激发。可调对象具有一个整数值,这个整数值可以在设定的最小值和最大值之间调整。通过增加/减少它们的单位/块增量或直接设置值,可以改变这个整数值。单位和块的准确定义依赖于实现Adjustable接口的对象,但是典型的块是由一定数日的单位组成。例如,文本编辑器可以定义单位是一行文本,一块则是一页。
- 当前版本的AWT中,只含有一个公共类实现 Adjustable接口,即java. awt.Scrollbaro激活滚动条箭头,可以按单位值为增量增加或减少滚动条的值。如果单击滚动条内箭头外的任何地方或滑块,可以按块值为增量增加或减少滚动条的值。一个滚动条的直观值对应滚动条滑动的宽度,是可以设置的。
- 通过调用ScrollPane .getHAdjustable () 和ScrollPane. get VAdjustable ( ),可以得到对 java . awt . ScrollPane含有的两种可调体的引用。
Adjustable接口的方法:
void addAdjustmentListener(AdjustmentListener l) //添加侦听器以在可调整对象的值更改时接收调整事件。
int getBlockIncrement() //获取可调整对象的块值增量。
int getMaximum() //获取可调整对象的最大值。
int getMinimum() //获取可调整对象的最小值。
int getOrientation() //获取可调整对象的方向。
int getUnitIncrement() //获取可调整对象的单位值增量。
int getValue() //获取可调整对象的当前值。
int getVisibleAmount() //获取比例指示符的长度。
void removeAdjustmentListener(AdjustmentListener l) //删除调整侦听器。
void setBlockIncrement(int b) //设置可调整对象的块值增量。
void setMaximum(int max) //设置可调整对象的最大值。
void setMinimum(int min) //设置可调整对象的最小值。
void setUnitIncrement(int u) //设置可调整对象的单位值增量。
void setValue(int v) //设置可调整对象的当前值。
void setVisibleAmount(int v) //设置可调整对象的比例指示器的长度。
2.3 项目事件
在可选择项自的构件中,选定或取消选定项目时将激发ItemEvent事件—复选框、选择框和列表。含有项日的 AWT构件( Checkbox、Checkbox-Menultem、Choice和 List)可以激发项目事件。
2.4 文本事件
最后一个语义事件 applet程序处理的是文本事件。含有可编辑文本的构件('TextField 和TextArea〉激发‘TextEvent事件,Textfield 和TextArea都扩展了,TextComponent类。当修改文本构件的可编辑文本时,激发TextEvent事件。