出于种种原因,SWT的底层事件机制事实上是有很多限制的,其中一个限制就是利用常规方式无法将focus锁定在一个控件里,例如一个文本框,我们要验证用户输入的文字为hello时才让用户的focus离开文本框,否则 就一直把focus锁定在文本框中,这虽然有点霸道,但是有时确实是业务的需求,不少人在eclipse newsgroup上提出这样的需求:
以下模式的代码可能是你想到的第一个解决方案,也就是我前面提到的所谓常规方法:
















































测试以上代码你会发现,focus根本没有锁住,并且屏幕上打出许多false。这是因为当代码运行到textField.setFocus()时,这个textField事实上还是有焦点的,对仍然有焦点的控件调用setFocus必然失败,结果返回一个false,focus自然不会被锁住啦。呵呵,失望吧,如果在Swing这可是小儿科的东西,到SWT里咋就这么难呢?主要是因为SWT与Swing的实现机理不同,它使用的控件都是重量级的OS native控件,所以自然会有这样那样的限制。别急,解决方案来啦!试试我写的下面这个FocusLocker吧,这个小东西好用着呢,不但能锁住focus,还能防止两个同时要求锁住focus的控件相互争抢focus导致死循环(例如focus在一个要求锁住focus的控件上,用户又去点了另外一个要求锁住focus的控件,这时就会出现这种情况)。下面是源代码:













































让我们来试一下这个小东西吧,还是刚才那段代码,我们只改锁focus的部分,注意,两个Text都是要求锁Focus的,试试它们有没有冲突:



















































