本文主要是介绍SWT/Jface StyledText 的Traverse,VerifyKey,MouseListener分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
StyledText 对 Page up Page down 按钮的支持
目标功能:
随便焦点的跳转(键盘的上下左右操作;键盘的PgUp、PgDown操作;鼠标的点击操作),得到焦点所在位置的Style信息。
StyledText可以添加TraverseListener, 表示对界面上的焦点移动的监听.
Java代码
1.getStyledText().addTraverseListener(new TraverseListener() {
2. public void keyTraversed(TraverseEvent e) {
3.
4. }
5. });
一般的处理代码都是对event.detail进行判断,再进行对应的操作, 代码如下:
Java代码
1.switch (event.detail) {
2. case SWT.TRAVERSE_NONE:
3. case SWT.TRAVERSE_ESCAPE:
4. case SWT.TRAVERSE_RETURN:
5. case SWT.TRAVERSE_TAB_PREVIOUS:
6. case SWT.TRAVERSE_TAB_NEXT:
7. case SWT.TRAVERSE_ARROW_PREVIOUS: // 上 或 左
8. case SWT.TRAVERSE_ARROW_NEXT: // 下 或 右
9. case SWT.TRAVERSE_MNEMONIC:
10. case SWT.TRAVERSE_PAGE_PREVIOUS:
11. case SWT.TRAVERSE_PAGE_NEXT:
12.}
但通过调试分析后发现:
event.keyCode
只监听 SWT.ARROW_LEFT, SWT.ARROW_RIGHT, SWT.ARROW_UP, SWT.ARROW_DOWN有效(也就是键盘上的上、下、左、右), 对于SWT.PAGE_UP, SWT.PAGE_DOWN都无效(也就是PgUp、PgDown按键)。
TraverseListener是不能用了, 因为PgUp、PgDown也会让界面的焦点移动,但却无法得到监听。于是,考虑换用VerifyKeyListener 和 MouseListener的组合来完成该需求。
VerifyKeyListener
对StyledText界面上的按键进行监听。能监听所有的按键操作。
MouseListener
对界面上的鼠标按下、鼠标弹起等进行监听。
具体实现就比较简单了:
Java代码
1.getStyledText().addMouseListener(new MouseAdapter() {
2. public void mouseUp(MouseEvent e) {
3. showCaretStyle();
4. }
5. });
6.getStyledText().addVerifyKeyListener(new VerifyKeyListener() {
7. public void verifyKey(VerifyEvent event) {
8. if (isTraverseKey(event.keyCode) {
9. showCaretStyle();
10. }
11. }
12.
13. private boolean isTraverseKey(int keyCode) {
14. if (event.stateMask == 0) {
15. if (SWT.ARROW_LEFT == event.keyCode || SWT.ARROW_RIGHT == event.keyCode || SWT.ARROW_UP == event.keyCode || SWT.ARROW_DOWN == event.keyCode
16. || SWT.PAGE_UP == event.keyCode || SWT.PAGE_DOWN == event.keyCode) {
17. return true;
18. }
19. }
20. return false;
21. }
22.
23. });
24.
25. protected void showCaretStyle() {
26. int caretOffset = dialog.getStyledText().getCaretOffset();
27. StyleRange beforeStyle = getCaretBeforeStyle(caretOffset);
28. System.out.println(beforeStyle);
29. }
30.
31. private StyleRange getCaretBeforeStyle(int caretOffset) {
32. if (caretOffset > 0) {
33. caretOffset--;
34. }
35. StyleRange[] styleRanges = this.dialog.getStyledText().getStyleRanges(caretOffset, 1);
36. if (styleRanges.length > 0) {
37. return styleRanges[0];
38. } else {
39. return null;
40. }
41. }
但问题来了,因为:int caretOffset = dialog.getStyledText().getCaretOffset();得到的还是在焦点移动前的caretOffset,而不是焦点移动后的caretOffset,这也比较好理解,因为在MouseListener、VerifyKeyListener里面,焦点还没有移动呢,你当然只可以拿到移动前的caretOffset了。
解决方法:让得到Style的线程sleep(100)再去获得caretOffset,这样就可以得到焦点移动后的caretOffset了。关键代码如下:
Java代码
1.Display.getCurrent().asyncExec(new Runnable() {
2. public void run() {
3. // 先等待100ms,让按键事件、鼠标点击事件先执行完成,焦点移动到新的位置上
4. try {
5. Thread.sleep(100);
6. } catch (Exception e) {
7. e.printStackTrace();
8. }
9.
10. // 再得到新的焦点所在位置的Style信息
11. showCaretStyle();
12. }
13.});
这篇关于SWT/Jface StyledText 的Traverse,VerifyKey,MouseListener分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!