`
esteem
  • 浏览: 156115 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

RCP中的几种选择监听(Selection Provider-Listener)机制

UI 
阅读更多

监听在一个特定的Viewer中的进行的选择是RCP开发中经常遇到的情况。例如,在TabelViewer中或TreeViewer中用户选择了一行数据或者一个节点时,需要针对当前的Selection做出某些处理(如更新Text组件中的数据)。

图1. Selection Provider和Listener在同一视图中 

图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在不同的视图中 

图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-rcp-2022-06-R-linux-gtk-x86_64.tar.gz

    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-rcp-2022-06-R-win32-x86_64.zip

    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收集资料上传

    在Eclipse RCP中,“Event-Listener”模式是一种设计模式,它允许组件之间通过事件进行通信。事件监听器是Java编程中常见的一种设计模式,用于处理特定事件的发生。在RCP应用中,一个组件可以通过注册监听器来响应...

    eclipse-rcp-2022-06-R-macosx-cocoa-x86_64.dmg

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

    RCP-1500中文操作手册.pdf

    索尼公司生产的RCP-1500系列遥控面板(包括RCP-1500、RCP-1501和RCP-1530型号)是用于配置和控制演播室级及广播级摄像机的专业设备。这些设备提供了高级的操作便利性和功能的多样性,使得用户能够高效地进行摄影机的...

    RCP 开发工具 eclipse-rcp-2020-06-R-linux-x86

    这个压缩包"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

    eclipse-rcp-2023-12-R-win32-x86_64.zip 适用于Windows系统

    eclipse-rcp-2022-06-R-linux-gtk-aarch64.tar.gz

    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-rcp-2022-06-R-macosx-cocoa-aarch64.dmg

    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 RCP是一种基于Eclipse平台的富客户端平台技术,它允许开发者创建独立于Eclipse环境的Java桌面应用程序。RCP通过提供一套标准组件和API,简化了桌面应用程序的开发流程,使开发者能够专注于业务逻辑而非界面...

    eclipse-rcp-2023-09-R-linux-gtk-x86-64.tar.gz

    Eclipse RCP的核心在于其插件机制,每个功能模块都是一个独立的插件,开发者可以根据需求选择安装或编写自己的插件,实现了高度的定制化。 在Linux环境下,Eclipse RCP采用了GTK+(GIMP Toolkit)作为图形用户界面...

    eclipse-rcp-2023-09-R-macosx-cocoa-x86-64.dmg

    eclipse-rcp-2023-09-R-macosx-cocoa-x86_64.dmg 适用于macOS Intel芯片系统

    eclipse-rcp-2023-09-R-macosx-cocoa-aarch64.dmg

    eclipse-rcp-2023-09-R-macosx-cocoa-aarch64.dmg 适用于macOS Arm芯片系统

    eclipse-rcp-2022-06-R-linux-gtk-x86_64.tar

    该压缩包 "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

    eclipse-rcp-2023-12-R-macosx-cocoa-aarch64.dmg 适用于macOS Arm芯片系统

    eclipse-rcp-2023-12-R-linux-gtk-x86-64.tar.gz

    eclipse-rcp-2023-12-R-linux-gtk-x86_64.tar.gz 适用于Linux x86_64位系统

    eclipse-rcp-2023-12-R-macosx-cocoa-x86-64.dmg

    eclipse-rcp-2023-12-R-macosx-cocoa-x86_64.dmg 适用于macOS Intel芯片系统

    eclipse-rcp-2023-06-R-win32-x86-64.zip

    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-2023-09-R-win32-x86_64.zip"后,你会得到一个Eclipse RCP的开发环境,包括开发工具、运行时组件以及可能包含的一些示例项目。使用Eclipse IDE启动该环境,你可以开始创建、调试和部署你的...

    eclipse-rcp-2023-12-R-linux-gtk-aarch64.tar.gz

    在2023年的最新版本"eclipse-rcp-2023-12-R"中,Eclipse团队为Linux ARM架构的用户带来了专门的版本——"linux-gtk-aarch64",这表明Eclipse RCP已经充分考虑到了多样化的硬件平台需求。 1. **Eclipse RCP核心特性*...

Global site tag (gtag.js) - Google Analytics