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小时内删除。