SWT中的事件模型
SWT中有关事件处理的类都打包在lipse.swt.events中,该包中主要有一些接口类,诸如类名为XXXListener,还有一些不同的事件类型,类名诸如XXXEvent。此外还有一些适配器类,诸如XXXAdapter。
(Listener)
所谓,也就是接收事件发生的对象,负责处理事件到达后响应事件的代码。
对象是一个接口,要响应一个事件就要实现该接口中的方法。
一个类型的中有不同的响应事件的方法。
-------------------------------------------------------------------------------
事件(Event)
当一个事件到达事件监听对象时,要携带一些该事件所附加的一些信息。
每种事件携带的信息稍有不同,但不论是什么事件,都可以从事件中获得以下信息:
* e.display:事件发生时的Display对象
* e.data:保存系统使用的数据,一般不常用
* e.widget:事件发生的控件对象,通常要进行强制的类型转换,因为所有的控件都继承自Widget类
* e.time:事件发生时的时间
这是因为所有的XXXEvent类都继承自TypedEvent类。TypedEvent类中的属性就是以上列举的这些属性
-------------------------------------------------------------------------------
注册
* 有了事件和事件类型,还需要将该对象注册给控件对象,使用addXXXListener方法。
* 可以为一个控件注册多个事件,不同的控件可以注册的监听事件是不同的。
* 为某一个控件注册对应的后,也可以移除该,使用removeXXXListener方法
-------------------------------------------------------------------------------
适配器
* 适配器可以简化事件处理的代码,形如XXXAdapter的类都是适配器类。
* 使用适配器类后,通过覆盖父类中的方法也可以达到与实现Listener接口同样的效果。
* 并不是每个都对应一个适配器类,只有类中响应时间的方法有多个时,才有必要使用 类。
* 的实现是选择适配器类还是实现接口的方式要根据不同的情况而确定。
综上所述,为控件响应事件的方法有以下几个步骤:
* 创建对象,实现中的方法(XXXListener)。
* 为控件注册(addXXXListener)。
* 控件与之间的桥梁是事件对象(XXXEvent)。
* 对于的接口中有多个事件响应方法的,也可以使用相应的适配器(XXXAdapter),通过覆盖父类中的方法来创建对象。
----------------------------------------------------------------------------------------
常用的事件
事件类型 和适配器 中的方法 说明 可注册的GUI控件
ArmEvent ArmListener widgetArmed() 菜单项被选中之前 Men
uItem
触发此事件
----------------------------------------------------------------------------------------
ControlEvent ControlListener controlMoved() 控件位置改变时 Control、
ControlAdapter controlResized() 控件大小改变时 TableColumn、Tracker
----------------------------------------------------------------------------------------
DisposeEvent DisposeListener widgetDisposed() 控件释放时 Widget
-
---------------------------------------------------------------------------------------
FocusEvent FocusListener focusGained() 控件获得焦点时 Control
FocusAdapter focusLost() 控件失去焦点时
----------------------------------------------------------------------------------------
HelpEvent HelpListener helpRequested() 按F1键获得帮助时 Control、Menu、
触发该事件 MenuItem
----------------------------------------------------------------------------------------
KeyEvent KeyListener keyPressed() 按键按下时 Control
KeyAdapter keyReleased() 按键释放时
----------------------------------------------------------------------------------------
MenuEvent MenuListener menuHidden() 显示菜单时 Menu
MenuAdapter menuShown() 隐藏菜单时
----------------------------------------------------------------------------------------
ModifyEvent ModifyListener modifyText() 文本被修改时 CCombo、Combo、
Text、StyledText
----------------------------------------------------------------------------------------
MouseEvent MouseListener mouseDoubleClick()鼠标双击时
MouseAdapter mouseDown() 鼠标按下时 Control
mouseUP() 鼠标抬起时
----------------------------------------------------------------------------------------
MouseMoveEvent MouseMoveListener mouseMove() 鼠标移动时 Control
----------------------------------------------------------------------------------------
MouseTrackEvent MouseTrackListener mouseEnter() 鼠标进入到控件区域时
MouseTrackAdapter mouseExit() 鼠标离开该控件区域时 Control
mouseHover() 鼠标在该控件的区域时
----------------------------------------------------------------------------------------
PaintEvent PaintListener paintControl() 绘制控件时 Control
----------------------------------------------------------------------------------------
SelectionEvent SelectionListener widgetSelected() Button、CCombo、Combo
SelectionAdapter widgetDefaultSelected() CoolItem、CTabFolder、List
MenuItem、Sash、Scale、
ScrollBar、Slider、 StyledText、TabFolder、 Table、TableCursor、
TableColumn、TableTree、
Text、TreeToolItem
----------------------------------------------------------------------------------------
ShellEvent ShellListener shellActivated()窗口被激活时 Shell
ShellAdapter shellClosed() 窗口关闭时
shellDeactivated()窗口变为非激活状态时
shellDeiconified()当窗口不是最小化时
shellIconified()当窗口最小化时
----------------------------------------------------------------------------------------
TraverseEvent TraverseListener keyTraversed() 按下Tab键切换时触发该事件 Control
----------------------------------------------------------------------------------------
TreeEvent TreeListener treeCollapsed() 折叠树节点时 Tree、TableTree
TreeAdapter treeExpanded() 展开树节点时
----------------------------------------------------------------------------------------
VerifyEvent VerifyListener verifyText() 改变文本时触发该事件 Text、StyledText
----------------------------------------------------------------------------------------
键盘事件(KeyEvent)
键盘事件中的各种属性
* e.widget
* e.display
* e.data
* e.time
* e.character:表示输入字符的Unicode编码。如果输入的不是字符,则该值为'\\0'。
* e.keyCode:按键所对应的ASCII代码,键的常量封装在SWT类中。
按键与其对应的keyCode常量:
按键 keyCode常量
方向键下 SWT.ARROW_DOWN
方向键上 SWT.ARROW_UP
方向键左 SWT.ARROW_LEFT
方向键右 SWT.ARROW_RIGHT
Alt键 SWT.ALT
空格键 SWT.BS
Enter键 SWT.CR
Ctrl键 SWT.CTRL
End键 SWT.END
Esc键 SWT.ESC
F1-F12键 SWT.F1-SWT.F12
Home键 SWT.HOME
Insert键 SWT.INSERT
Page Down下翻页键 SWT.PAGE_DOWN
Page UP上翻页键 SWT.PAGE_UP
Shift键 SWT.SHIFT
Tab键 SWT.TAB
换行键 SWT.LF
* e.stateMask:按下其他键的同时所使用的辅助键。辅助键包括Ctrl键、Shift键和Alt键。
* e.doit:是否继续执行此事件。设置为false,则取消该事件。
mousemove是什么键综上所述,若要判断输入的文本,则使用character属性;若要屏蔽一些快捷键的功能,则需要使用 ----------------------------------------------------------------------------------------
鼠标事件
鼠标单击和双击事件(MouseEvent)、鼠标移动事件(MouseMoveEvent)、
鼠标跟踪事件(MouseTrackEvent)。
鼠标事件的各种属性
* e.button:鼠标按键的ID,从左向右依次0、1、2。如果设置的鼠标为左手使用,则从右向左排列,该属性一般用的机会很少。
* e.stateMask:在使用鼠标时同时按下的辅助键,与键盘使用的辅助键相同。使用常量SWT.BUTTON_MASK可以判断是否使用了辅助键。
if ((e.stateMask & SWT.BUTTON_MASK) == 0) {
System.out.println("没有按下任何辅助键");
}
* e.x:事件发生时,鼠标相对于该事件发生的控件的x坐标。
* e.y:事件发生时,鼠标相对于该事件发生的控件的y坐标。事件发生的坐标属性是常用的属性。
----------------------------------------------------------------------------------------
其他常用的事件
选中事件(SelectionEvent)的各种属性:
* e.item:选中事件发生时,一般可以进行强制类型转换获得触发该事件的控件。
public void widgetSelected(SelectionEvent e) {
Button bt = (Button)e.item;
}
* e.detail:事件发生时附加的额外信息,根据不同的控件,有不同的值。不同的控件触发该事件时所携带的不同的值。
控件 对应的常量
Sash SWT.DRAG
ScrollBar和Slider SWT.DRAG、SWT.HOME、SWT.END、SWT.ARROW_DOWN、SWT.ARROW_UP、SWT.PAGE_DOWN、SWT.PAGE_UP
Table and Tree SWT.CHECK
CoolItem and ToolItem SWT.ARROW
注:获得该属性时,只能是上面这些控件触发选中事件时才携带所对应的常量值,若为其他的控件,该值为null。
* e.x、e.y、e.width和e.height:分别为事件发生的x、y坐标,宽和高。不同的控件触发该事件,会有不同的值。该属性一般不常用。
* e.stateMask:选中控件时所使用的辅助键。与键盘事件中的stateMask属性意义相同。
* e.text:针对带有超级链接的Link控件所使用的,值为超级链接中的href的值。
* e.doit:是否执行该事件。
----------------------------------------------------------------------------------------
文件修改事件(VerifyEvent和ModifyEvent):
VerifyEvent事件比ModifyEvent事件所携带的事件信息多,而且VerifyEvent在ModifyEvent之前发生。
VerifyEvent的各种属性:
VerifyEvent类从继承关系上来说继承自KeyEvent,所有具有KeyEvent的属性。VerifyEvent对象除了携带KeyEvent属性外还有其他的一些属性:
* e.start和e.end:修改字符的起始位置。
* e.text:新插入的文本。
判断用户进行的操作是插入还是删除操作:
public void verifyText(VerifyEvent e){
int start = e.start;
int end = e.end;
if (start == end) { // 表示为插入操作
System.out.println("您在" + e.start + "位置,插入了" + e.text + "字符");
} else {// 表示为删除操作
System.out.println("您删除了字符" + Text().substring(e.start, e.en
d));
}
}
VerifyEvent和ModifyEvent的区别:
* VerifyEvent比ModifyEvent携带更多的事件信息
信息包括修改的字符和字符所在的位置。而ModifyEvent则不能够获得这些信息,它只知道文本是否被修改了,具体修改了哪些内容不能获得。因此,ModifyEvent事件一般用于保存文本等操作,这些操作不需要获得修改文本的详细信息。VerifyEvent事件适用于对修改文本有效性的判断,因为此操作可能需要查询修改的具体信息。
* VerifyEvent事件发生的优先级高于ModifyEvent
当文本修改时,总是首先触发VerifyEvent事件,当该事件的doit属性为true时,才触发ModifyEvent事件。
----------------------------------------------------------------------------------------
无类型的事件
有类型的事件都是继承自TypedEvent类。
有类型的事件更加面向对象,但效率比较低。使用无类型的事件虽然效率比较高,但是用无类型的事件处理代码会比较繁琐。
* 注册无类型事件
addListener(int eventType, Listener listener)
其中,eventType为SWT中封闭的常量,表示事件的类型。listener为对象,该接口中只有一个方法
void handleEvent(Event event)。
SWT类所代表的事件常量:
事件类型常量 说明
SWT.Activate 当激活窗口时
SWT.Arm 菜单项被选中之前
SWT.Close 当关闭窗口时
SWT.Collapse 折叠树的节点时
SWT.Deactivate 窗口处于非激活状态时
SWT.DefaultSelection 默认选中时
SWT.Deiconify 窗口不是最小化时
SWT.Dispose 释放资源时
SWT.DragDetect 拖动控件时
SWT.Expand 展开树节点时
SWT.FocusIn 控件获得焦点时
SWT.FocusOut 控件失去焦点时
SWT.HardKeyDown 硬件按键按下时,例如Pocket PC
SWT.HardKeyUp 硬件按键抬起时,例如Pocket PC
SWT.Help 按下帮助键时
SWT.Hide 隐藏控件时
SWT.Iconify 窗口最小化时
SWT.KeyDown 按下按键时
SWT.KeyUp 抬起按键时
SWT.MenuDetect 选中菜单时
SWT.Modify 文本修改时
SWT.MouseDoubleClick 双击鼠标时
SWT.MouseDown 鼠标按下时
SWT.MouseEnter 鼠标进入时
SWT.MouseExit 鼠标离开时
SWT.MouseHover 鼠标在控件区域上时
SWT.MouseMove 鼠标移动时
SWT.MouseUp 鼠标抬起时
SWT.Move 移动控件时
SWT.None 无类型事件
SWT.Paint 绘制控件时
SWT.Resize 重新设置控件大小时
SWT.Selection 选中控件时
SWT.Show 显示控件时
SWT.Traverse 使用Tab键切换时
SWT.Verify 文本进行修改时
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论