SWT对于监听Tab键的理解

最近,在些一个SWT的Diglog因为觉得里面的Button不好用,所以自己手动编写了一个Button类继承Cavas,但是发现对于键盘的Tab按钮并没有什么反应,为了想做到与SWT自带的Button一样对Tab事件的监听,就顺带研究了一下这个Tab按钮是如何实现的,先说说SWT是如何对Tab事件的监听,和如何推论出下一个tab移动的组件

在SWT中,键盘的TAB键是在display里面做了监听,还包括一些其他移动性按钮(上下按钮等)

所以当按Tab键的时候,控件里面的translateTraversal()方法被触发了,大概的流程如下:

  1. 首先寻找到当前组件的顶层组件容器shell
  2. 推算出当前的组件是否tab组件,如果不是tab组件,寻找它的子类
  3. 寻找到它的下一个组件进行推算
  4. 假如下一个组件为Tab组件,或者它添加了按钮监听事件,侧被视为下一个跳转按钮组件

根据上面的讲解,找到了所有组件的根类Widget,然后发现,Widget的组件,默认调用setTabItemFocus ()这个方法,返回false,被视为非tab跳转组件,既然Button被视为下一个Tab组件,说明setTabItemFocus ()这个方法被重写了,不难找到control重写了setTabItemFocus()方法,所以继承他的Button类会被视为Tab的组件,继承widget下的Scrollable没有重新setTabItemFocus()方法,所以往下的所有组件都不视为Tab组件,包括Composite,按照这样的推论,假如自定义一个继承至widget的类都能重写setTabItemFocus()这个方法就可以了,但是,setTabItemFocus()这个方法,在Widget里面被视为只有同包才能重写此方法,所以不能往这个方向着手了。

然后发现了Canvas类下,有两个子类,一个是CLabel,另外一个是FormText,CLabel不视为Tab组件,但FormText居然视为Tab组件,而FormText跟Widget既不同包也不同插件,所以它根本没有重写setTabItemFocus ()这个方法,怎么可能会被视为Tab组件呢。看了看代码,发现记得之前的SWT校验Tab组件的其中一个条件是,当组件有按钮下按监听事件的时候,就会被视为Tab组件。果然发现了FormText类的构造函数中,添加了几个按钮监听事件,那一切都好办了,只要能在自定义的Button组件中,添加按钮的监听事件,那键盘Tab转移聚焦组件的功能就不难实现了

时间: 2024-10-12 16:00:34

SWT对于监听Tab键的理解的相关文章

Android监听home键

/** * * 监听Home键 */ private BroadcastReceiver mHomeKeyEventReceiver = new BroadcastReceiver() { String SYSTEM_REASON = "reason"; String SYSTEM_HOME_KEY = "homekey"; String SYSTEM_HOME_KEY_LONG = "recentapps"; @Override public

[转]Android 如何监听返回键,弹出一个退出对话框

本文转自:http://blog.csdn.net/sunnyfans/article/details/8094349 Android 如何监听返回键点击事件,并创建一个退出对话框, 防止自己写的应用程序不小心点击退出键而直接退出.自己记录下这个简单的demo,备用. 注:如下代码当时是从网上copy过来的,现在忘了它出自哪个原作者了,在此说声抱歉. 源码如下: [html] view plaincopyprint? public class BackKeyTest extends Activi

Android监听Home键的完美解决方案

相信有不少朋友在开发过程中需要监听HOME键的需求,现本人将代码奉上,希望对大家有所帮助! import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; public class HomeWatcher { private static final String TAG = "

大叔也说Xamarin~Android篇~监听返回键,单击返回某个webView,双击退出

原文:大叔也说Xamarin~Android篇~监听返回键,单击返回某个webView,双击退出 这个操作在原生android里是很容易实现的,在xamarin里也不难,在activity里有方法OnKeyDown,我们只需要重写一下就可以了,然后通过webView重新加载到要返回的页面即可,当然操作有些死板,但还是有着不错的效果! 实现的原理就是在activity里设置一个时间,单击后把这个时间赋值并与当前时间进行比较,如果在2秒内,就认为是双击操作,当然这个时间间隔你可以自己设置,在认为是双

Android 监听Home键

游戏需要统计用户退出游戏是按的返回键还是home,因为返回键是自己cocos2dx做的监听,所以这里说一下android Activity里监听Home键方法,亲测可用,这里做个备份其中也是参考别人的代码实现的,路径没有记住,如有雷同,望见谅-- 这里使用的是广播的形式监听Home操作的方法: 首先在MainActivity里添加如下广播,生成一个成员变量:  private final BroadcastReceiver homeReceiver = new BroadcastReceiver

Android 监听返回键退出程序的两种实现

1.Android 双击返回键退出程序 思路:用户按下返回键时设定一个定时器来监控是否2秒内实现了退出,如果用户没有接着按返回键,则清除第一次按返回键的效果,使程序还原到第一次按下返回键之前的状态.定时器是每次用户按下返回键才去创建. 代码如下: /** * 菜单.返回键响应 */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub if(keyC

Android监听HOME键的最简单的方法

public static final int FLAG_HOMEKEY_DISPATCHED = 0x80000000; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.getWindow().setFlags(FLAG_HOMEKEY_DISPATCHED, FLAG_HOMEKEY_DISPATCHED);//关键代码 setContentView(R.la

android 监听返回键

android监听返回键 public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { return true; } return super.onKeyDown(keyCode, event); } event.getRepeatCount() == 0重复次数:1次

Android监听返回键、Home键+再按一次返回键退出应用

Android监听返回键需重写onKeyDown()方法 Home键keyCode==KeyEvent.KEYCODE_HOME [java] view plain copy @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { //++自定义点击事件 return tru