自定义控件通常是从一个Composite或者Canvas继承而来,但是缺省状态下,这两个控件都无法通过键盘的Tab键得到焦点。通过对SWT的debug,我发现要实现该事件,必须满足一个必要条件:为自定义控件安装一个KeyEvent的监听器。
实际上我个人认为这出自于SWT的实现者自己的考虑,可能认为如果没有KeyListener,也就意味着没有Key的操作,那么也无需通知Travserse事件,Travserse事件的前提就是Key操作。但是在某些特定情况下我们不需要KeyListener,也可以模拟出KeyEvent的效果,比如通过TraverseListener的keyTraversed方法。总而言之,想通过键盘为某一个自定义控件获取焦点,就老老实实的给控件加一个KeyListener吧。
此处附加一些和Traverse相关的小知识:
1、如何通过键盘的Tab键跳出 Multiple Style 的Text?
请使用 Ctrl+Tab 组合键。
2、如何通过键盘操作让上一个控件获取焦点?
请使用 Shift+Tab 或者 Ctrl+Shift+Tab 组合键。
3、Button 可以通过回车键和空格键激活。所以如果有些地方无法使用回车键(比如按钮在Dialog中),可以考虑使用空格键。
4、一些特殊的KeyCode:
回车键:SWT.KEYPAD_CR
小键盘的回车键:SWT.TRAVERSE_RETURN
方向键:SWT.ARROW_UP,SWT.ARROW_DOWN,SWT.ARROW_LEFT,SWT.ARROW_RIGHT