监听在一个特定的Viewer中的进行的选择是RCP开发中经常遇到的情况。例如,在TabelViewer中或TreeViewer中用户选择了一行数据或者一个节点时,需要针对当前的Selection做出某些处理(如更新Text组件中的数据)。
图1. Selection Provider和Listener在同一视图中
为了方便对此机制的介绍,我们设定一个如图1中所示的场景,当用户在视图左边的TabelViewer中选择一个节点后,在右边的Text Component中将显示出所选择的内容。
在RCP的开发中,我们可以基于实际情况的不同,采取以下的办法:
1. 直接调用Viewer的addSelectionChangedListener方法
2. 使用Selection Provider-Selection Listener机制
此两种方法,各自有优缺点及适用的范围,以下将分别对其说明。
直接调用Viewer的addSelectionChangedListener方法
这种方法是最简单明了的,它只需要在Viewer的addSelectionChangedListener方法中实现一个Listener即可。但它只适用于Viewer和Listener在同一个视图中的情况下,如图1所示。也就是说,如果我们的Viewer和Text Component在同一个视图中,可以使用一个Listener监听在同一个视图中发生的Selection变化。
实现的过程如下:
a. 定义并初始化一个Viewer。
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->TableViewer viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
b. 在Viewer的addSelectionChangedListener方法中定义一个Listner。
c. 在Listner中实现对UI Component的数据更新。
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->viewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
ISelection selection = event.getSelection();
if (selection !=null ) {
String value = (String) ((IStructuredSelection) selection).getFirstElement();;
//txtValue是一个UI Component,用于更新当前选择的数据
txtValue.setText(value);
}
}
});
使用Selection Provider-Selection Listener机制
这种机制是在实践中最经常用到的,特别是用在Selection发生的视图和Listener所在的视图不相同的情况下(如图2所示)。虽然所在视图不相同,但他们都处于一个相同的WorkbenchPage中。在这种方法中,我们需要首先定义一个Selection的Provider,即谁提供这个Selection Event,本例中当然是Viewer。然后,我们需要生成一个Listener用来处理Selection Event。而Provider和Listener之间的关联,可以通过由当前WorkbenchPage管理的Listener注册器完成。即将我们的Listener注册到这个注册器中,一旦当前WorkbenchPage的SelectionProvider发出SelectionChangedEvent时,所有注册的Listener就可以做出相应的处理。
图2. Selection Provider和Listener在不同的视图中
实现的过程如下:
a. 在视图1中定义并初始化一个Viewer。
TableViewer viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
b. 在视图1中定义Viewer为SelectionProvider。
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->getSite().setSelectionProvider(viewer);
c. 在同一WorkbenchPage中的视图2中定义一个ISelectionListener,为了方便处理视图内的UI Component,通常在视图中实现此接口。
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->public class DetailsView extends ViewPart implements ISelectionListener
d. 实现ISelectionListener的方法selectionChanged,用于处理Selection变化。
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->@Override
public void selectionChanged(IWorkbenchPart part, ISelection selection) {
if (selection !=null ) {
String value = (String) ((IStructuredSelection) selection).getFirstElement();;
//txtValue是一个UI Component,用于更新当前选择的数据
txtValue.setText(value);
}
}
e. 将实现了ISelectionListener的Listener(通常就是视图自己)注册到当前WorkbenchPage管理的Listener注册器。
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->getSite().getPage().addSelectionListener((ISelectionListener) this);
此方法需要注意的是,在同一个视图中只能定义一个SelectionProvider,但针对此Provider可以在不同的视图中注册多个Listener。相反,一个已注册的Listener可以同时监听,来自不同视图的SelectionProvider发出的SelectionChangedEvent。为了进一步限制监听的对象,可以在注册时指定监听的视图。
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->getSite().getPage().addSelectionListener(SampleView.ID, (ISelectionListener) this);
这样,SelectionListener只监听来自SampleView的SelectionChangedEvent。
总结
在常规的RCP开发中,处理Selection监听的任务,通过上述的两种方法可以轻松的完成。若Selection的Provider和Listener都在一个视图,且只需要简单处理SelectionChangedEvent时,我们可以选择方法1即可。若Selection的Provider和Listener分散在两个或多个视图时,我们必须通过方法2完成。当然,对于在同一视图的情况,我们也可以通过方法2实现,原理也是一样的。另外,其他较为复杂的Selection Provider-Listener的情况,还可以使用RCP的IAdaptable实现。
分享到:
相关推荐
Eclipse IDE for RCP and RAP Developers(eclipse-rcp-2022-06-R-linux-gtk-x86_64.tar.gz) 适用于Linux x86_64: A complete set of tools for developers who want to create Eclipse plug-ins, Rich Client ...
Eclipse IDE for RCP and RAP Developers(eclipse-rcp-2022-06-R-win32-x86_64.zip) 适用于Windows x86_64: A complete set of tools for developers who want to create Eclipse plug-ins, Rich Client ...
索尼公司生产的RCP-1500系列遥控面板(包括RCP-1500、RCP-1501和RCP-1530型号)是用于配置和控制演播室级及广播级摄像机的专业设备。这些设备提供了高级的操作便利性和功能的多样性,使得用户能够高效地进行摄影机的...
在Eclipse RCP中,“Event-Listener”模式是一种设计模式,它允许组件之间通过事件进行通信。事件监听器是Java编程中常见的一种设计模式,用于处理特定事件的发生。在RCP应用中,一个组件可以通过注册监听器来响应...
Eclipse IDE for RCP and RAP Developers(eclipse-rcp-2022-06-R-macosx-cocoa-x86_64.dmg) 适用于macOS x86_64: A complete set of tools for developers who want to create Eclipse plug-ins, Rich Client ...
这个压缩包"eclipse-rcp-2020-06-R-linux-x86"是专门为Linux x86(AMD)平台设计的版本,包含了开发基于Eclipse RCP应用所需的基础工具集。 **Eclipse RCP关键知识点** 1. **基础架构**:Eclipse RCP的核心在于其...
eclipse-rcp-2023-12-R-win32-x86_64.zip 适用于Windows系统
Eclipse IDE for RCP and RAP Developers(eclipse-rcp-2022-06-R-linux-gtk-aarch64.tar.gz) 适用于Linux aarch64: A complete set of tools for developers who want to create Eclipse plug-ins, Rich Client ...
Eclipse IDE for RCP and RAP Developers(eclipse-rcp-2022-06-R-macosx-cocoa-aarch64.dmg) 适用于macOS aarch64: A complete set of tools for developers who want to create Eclipse plug-ins, Rich Client ...
Eclipse RCP是一种基于Eclipse平台的富客户端平台技术,它允许开发者创建独立于Eclipse环境的Java桌面应用程序。RCP通过提供一套标准组件和API,简化了桌面应用程序的开发流程,使开发者能够专注于业务逻辑而非界面...
Eclipse RCP的核心在于其插件机制,每个功能模块都是一个独立的插件,开发者可以根据需求选择安装或编写自己的插件,实现了高度的定制化。 在Linux环境下,Eclipse RCP采用了GTK+(GIMP Toolkit)作为图形用户界面...
eclipse-rcp-2023-09-R-macosx-cocoa-x86_64.dmg 适用于macOS Intel芯片系统
eclipse-rcp-2023-09-R-macosx-cocoa-aarch64.dmg 适用于macOS Arm芯片系统
该压缩包 "eclipse-rcp-2022-06-R-linux-x86_64" 中包含的主要文件是 "eclipse-rcp-2022-06-R-linux-x86_64",这可能是一个可执行的Eclipse IDE实例,用于在Linux系统上支持RCP和RAP的开发。为了运行这个IDE,你需要...
eclipse-rcp-2023-12-R-macosx-cocoa-aarch64.dmg 适用于macOS Arm芯片系统
eclipse-rcp-2023-12-R-linux-gtk-x86_64.tar.gz 适用于Linux x86_64位系统
eclipse-rcp-2023-12-R-macosx-cocoa-x86_64.dmg 适用于macOS Intel芯片系统
1. **解压**: 首先,你需要解压缩"eclipse-rcp-2023-06-R-win32-x86-64.zip"到你选择的目录,通常建议在非系统盘创建一个专门的Eclipse文件夹。 2. **启动Eclipse**: 找到解压后的eclipse可执行文件,双击运行。...
下载并解压"eclipse-rcp-2023-09-R-win32-x86_64.zip"后,你会得到一个Eclipse RCP的开发环境,包括开发工具、运行时组件以及可能包含的一些示例项目。使用Eclipse IDE启动该环境,你可以开始创建、调试和部署你的...
在2023年的最新版本"eclipse-rcp-2023-12-R"中,Eclipse团队为Linux ARM架构的用户带来了专门的版本——"linux-gtk-aarch64",这表明Eclipse RCP已经充分考虑到了多样化的硬件平台需求。 1. **Eclipse RCP核心特性*...