`
lggege
  • 浏览: 375469 次
  • 性别: 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(Standard Widget Toolkit)库中的一个关键组件,用于创建具有格式化文本功能的控件。它允许开发者处理带有多种样式的文本,比如字体、颜色、下划线等,尤其适用于编辑器或...

    SWT(JFace)体验之StyledText类

    在SWT中,`StyledText`类是一个非常重要的组件,它提供了比基本`Text`组件更强大的文本处理功能,允许开发者创建带有格式化的文本,如不同颜色、字体、高亮等。`StyledText`类对于需要展示和编辑富文本的应用场景...

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

    ### 开发项目用SWING与RCP与SWT.JFACE的分析 #### 一、SWT简介 SWT(Standard Widget Toolkit)作为一种图形用户界面工具包,为Java开发者提供了创建高性能且外观统一的桌面应用程序的能力。相较于传统的AWT和...

    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 =...

    java简单记事本

    在Java中,可以使用`Text`或`StyledText`的`getSelection()`获取选中文本,`cut()`、`copy()`和`paste()`方法来执行相应操作。剪贴板数据通过`Clipboard`类管理。 4. **删除**:`remove()`方法可以删除指定范围的...

    SWT(JFace) 文本编辑器 实现代码

    - `BufferedReader` 和 `FileReader` 用于读取文件内容到`StyledText` 中,`FileWriter` 用于将`StyledText` 的内容写入文件。 - `lastOpenDirectory` 保存了上次打开文件的目录,方便下次打开文件时作为默认路径...

    abc.zip_Java Word_SWT word_java 取 word_word

    如果是旧版的Word文档(.doc),可以使用`org.eclipse.swt.custom.StyledText`结合`org.eclipse.swt.dnd.TextTransfer`进行文本抽取。 7. 处理读取到的文本数据,例如分段、去格式化或进行其他分析。 在...

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

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

    javascript实现的制作特殊字的脚本

    var styledText = document.createElement('span'); styledText.textContent = 'This text is special!'; styledText.style.fontSize = '24px'; styledText.style.color = 'red'; styledText.style.fontWeight ...

    SWT examples

    在SWT中,这可能涉及到` StyledText`组件,它可以支持多行文本,并允许设置特定样式,如不同的字体、颜色。开发者可以学习如何解析和显示不同语言的代码,并实现基本的代码编辑功能。 3. **绘图编辑器**: 这个...

    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', }, });

    SWT事件一览表

    - **监听器和适配器**:`MouseListener`和`MouseAdapter` - **监听器中的方法**: - `mouseDoubleClick()`: 当鼠标双击时触发。 - `mouseDown()`: 当鼠标按钮被按下时触发。 - `mouseUp()`: 当鼠标按钮被释放时...

    Android-Rialto是一个基于AnnotationSpans的Android文本样式库

    val styledText = style(text) { span(style = bold) { append("粗体文本") } span(style = italic) { append("斜体文本") } link(url = "https://example.com") { append("点击链接") } } textView.text = ...

    SWT(JFace) 打印功能

    此外,`StyledText`的样式信息(如字体、颜色)可能无法在打印过程中完全保留,因此在打印时可能需要调整文本格式以适应黑白打印机或不同的打印质量。 总之,SWT 和 JFace 提供了丰富的API来支持打印功能,使得...

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

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

    Java基于SWT编写记事本

    这涉及到 StyledText 组件,它可以处理不同样式的文本。 4. **查找和替换**:实现文本的查找和替换功能,需要用到字符串操作和正则表达式匹配。 5. **撤销和重做**:利用栈数据结构记录文本的修改历史,实现撤销和...

    org.eclipse.jface.text_3.12.0.v20170523-1043.jar

    该模块包含了许多关键组件,如Text、StyledText和SourceViewer,它们在构建复杂文本编辑器时起着核心作用。 在3.12.0.v20170523-1043这个特定版本中,Eclipse JFace Text引入了一些重要的更新和改进。虽然描述中...

Global site tag (gtag.js) - Google Analytics