`
lggege
  • 浏览: 372775 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

StyledText 的Traverse,VerifyKey,MouseListener分析

    博客分类:
  • RCP
阅读更多
目标功能:
    随便焦点的跳转(键盘的上下左右操作;键盘的PgUp、PgDown操作;鼠标的点击操作),得到焦点所在位置的Style信息。


StyledText可以添加TraverseListener, 表示对界面上的焦点移动的监听.
getStyledText().addTraverseListener(new TraverseListener() {
			public void keyTraversed(TraverseEvent e) {

			}
		});


一般的处理代码都是对event.detail进行判断,再进行对应的操作, 代码如下:
		switch (event.detail) {
			case SWT.TRAVERSE_NONE:
			case SWT.TRAVERSE_ESCAPE:
			case SWT.TRAVERSE_RETURN:
			case SWT.TRAVERSE_TAB_PREVIOUS:
			case SWT.TRAVERSE_TAB_NEXT:
			case SWT.TRAVERSE_ARROW_PREVIOUS: // 上 或 左
			case SWT.TRAVERSE_ARROW_NEXT: // 下 或 右
			case SWT.TRAVERSE_MNEMONIC:
			case SWT.TRAVERSE_PAGE_PREVIOUS:
			case SWT.TRAVERSE_PAGE_NEXT:
		}


但通过调试分析后发现:
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
对界面上的鼠标按下、鼠标弹起等进行监听。


具体实现就比较简单了:
getStyledText().addMouseListener(new MouseAdapter() {
			public void mouseUp(MouseEvent e) {
                             showCaretStyle();
			}
		});
getStyledText().addVerifyKeyListener(new VerifyKeyListener() {
			public void verifyKey(VerifyEvent event) {
                             if (isTraverseKey(event.keyCode) {
                                 showCaretStyle();
                             }
			}

	private boolean isTraverseKey(int keyCode) {
		if (event.stateMask == 0) {
			if (SWT.ARROW_LEFT == event.keyCode || SWT.ARROW_RIGHT == event.keyCode || SWT.ARROW_UP == event.keyCode || SWT.ARROW_DOWN == event.keyCode
					|| SWT.PAGE_UP == event.keyCode || SWT.PAGE_DOWN == event.keyCode) {
				return true;
			}
		}
		return false;
	}

		});

	protected void showCaretStyle() {
		int caretOffset = dialog.getStyledText().getCaretOffset();
                StyleRange beforeStyle = getCaretBeforeStyle(caretOffset);
                System.out.println(beforeStyle);
        }

	private StyleRange getCaretBeforeStyle(int caretOffset) {
		if (caretOffset > 0) {
			caretOffset--;
		}
		StyleRange[] styleRanges = this.dialog.getStyledText().getStyleRanges(caretOffset, 1);
		if (styleRanges.length > 0) {
			return styleRanges[0];
		} else {
			return null;
		}
	}


但问题来了,因为:int caretOffset = dialog.getStyledText().getCaretOffset();得到的还是在焦点移动前的caretOffset,而不是焦点移动后的caretOffset,这也比较好理解,因为在MouseListener、VerifyKeyListener里面,焦点还没有移动呢,你当然只可以拿到移动前的caretOffset了。


解决方法:让得到Style的线程sleep(100)再去获得caretOffset,这样就可以得到焦点移动后的caretOffset了。关键代码如下:
		Display.getCurrent().asyncExec(new Runnable() {
			public void run() {
				// 先等待100ms,让按键事件、鼠标点击事件先执行完成,焦点移动到新的位置上
				try {
					Thread.sleep(100);
				} catch (Exception e) {
					e.printStackTrace();
				}

				// 再得到新的焦点所在位置的Style信息
				showCaretStyle();
			}
		});
分享到:
评论

相关推荐

    styledtext

    eclipse插件开发相关技术,styledtext实现关键字高亮显示

    SWT(JFace)体验之StyledText类

    有的时候Text需要实现这种那种的样式。先提供在不使用StyledText类的情况:

    开发项目用SWING与RCP与SWT.JFACE的分析

    SWT对用户操作的响应,比如鼠标或键盘事件,也是采用了AWT和SWING中的Observer模式,在*.event包中可以找到事件监听的Listener接口和相应的事件对象,例如常用的鼠标事件监听接口MouseListener,MouseMoveListener和...

    react-native-styled-text:React Native的样式化文本

    试试看在线演示安装要将库安装到项目中,请运行yarn或npm: yarn add react-native-styled-text 或者npm i react-native-styled-text 例子使用默认样式对于简单的样式, StyledText支持一些预定义的样式: b:粗体i...

    org.eclipse.swt 相关jar包

    org.eclipse.swt 相关jar包,JAVA调用火狐内核制作浏览器教程中所需,供各位下载,可在我的博客中查看详细用法。

    styled-text:对iOS的声明性文本样式和简化的Dynamic Type支持

    StyledText StyledText是一个库,可简化iOS应用程序中动态文本的样式。 您不必在每次需要更新文本时都使用属性字符串,而可以在标签上声明性地设置文本样式。 标签文本更新后,标签将使用预设样式。 前 let label =...

    第8章 SWT复杂控件的使用.pptx

    8.1 样式文本(StyledText) 8.2 SWT表格(Table)的设计 8.3 SWT树(Tree)的设计 8.4画布Canvas与图像的使用 8.5剪切板的使用及SWT的拖放操作

    fullstack-react-native-book-r2

    import React from 'react';...export default class StyledText extends React.Component { render() { return ( ); } } const styles = StyleSheet.create({ text: { color: 'red', fontWeight: 'bold', }, });

    go-ansi-parser:去解析器的ANSI字符串

    用于解析ANSI编码的字符串的库 Go ANSI Parser将带有字符串转换为代表样式文本的结构片段。 特征: 可以解析ANSI 16、256和TrueColor 支持所有样式:常规,粗体,淡淡,... StyledText { { Label : "Hello Worl

    SWT-Hex-Control-开源

    一个用 Java 编写并使用来自 Eclipse 的 SWT-Toolkit 的十六进制控件。 SWT-Hex-Control 基于 StyledText-SWT-Control,它修改事件以提供类似十六进制编辑的行为。 它以一类的形式出现。

    org.eclipse.swt.win32

    org.eclipse.swt.events.MouseListener.class org.eclipse.swt.events.MouseMoveListener.class org.eclipse.swt.events.MouseTrackAdapter.class org.eclipse.swt.events.MouseTrackListener.class org.eclipse.swt...

Global site tag (gtag.js) - Google Analytics