使用Eclipse RCP创建视图并实现视图间消息传递(二)
2008-05-30 21:55
429 查看
在上一文中,我们介绍了怎样创建一个Eclipse RCP,并创建用户交互的视图,但是并没有提到如何实现视图的交互。在本文中,我们会介绍以两种不同的方式实现Eclipse RCP View之间的交互,并结合代码详细领略一下Eclipse是如何巧妙处理View之间交互的。
首先介绍一下我们要达到的效果,如下图所示:
public class NavigationView extends ViewPart implements ISelectionProvider
以下是ISelectionProvider接口的定义:
1
(2)有了以上步骤还不够,还需要将视图中具体的Viewer上想要发生的事件,注册到这个Provider上。
this.getSite().setSelectionProvider(this);
注意this对象指的是Viwe视图,它具有指向Site的引用,通过getSite()方法获得引用
(4)最后,还要把讲给听众听,没有听众也是白讲,这里是在setSelection()方法里迭代每一个注册了ISelectionListener的控件,找到它们,把事件传递给这些听众即可:
site.getPage().addSelectionListener(this);
然后实现public void selectionChanged(IWorkbenchPart part, ISelection selection) {}方法即可。这样,当SelectionProvider中的选择发生改变时,这个视图中的selectionChanged()方法就会被调用。
即如下方式:
1package hellorcp;
2
3import java.util.ArrayList;
4import java.util.Iterator;
5
6import org.eclipse.jface.action.IToolBarManager;
7import org.eclipse.jface.viewers.ISelection;
8import org.eclipse.jface.viewers.ISelectionChangedListener;
9import org.eclipse.jface.viewers.ISelectionProvider;
10import org.eclipse.jface.viewers.IStructuredContentProvider;
11import org.eclipse.jface.viewers.ListViewer;
12import org.eclipse.jface.viewers.SelectionChangedEvent;
13import org.eclipse.swt.SWT;
14import org.eclipse.swt.widgets.Composite;
15import org.eclipse.ui.part.ViewPart;
16import hellorcp.NavigationViewLabelProvider;
17
18
1package hellorcp;
2
3import java.util.ArrayList;
4
5import org.eclipse.jface.viewers.ISelection;
6import org.eclipse.jface.viewers.IStructuredSelection;
7import org.eclipse.jface.viewers.TableViewer;
8import org.eclipse.swt.SWT;
9import org.eclipse.swt.widgets.Composite;
10import org.eclipse.swt.widgets.Group;
11import org.eclipse.swt.widgets.Label;
12import org.eclipse.swt.widgets.Table;
13import org.eclipse.swt.widgets.Text;
14import org.eclipse.ui.ISelectionListener;
15import org.eclipse.ui.IWorkbenchPart;
16import org.eclipse.ui.part.ViewPart;
17
18
将以上文件重新编译,再运行我们的Hello RCP,可以看到,点击Navigation Views时,已经可以将选择的人员信息传递给detal view了,我们的视图真正动了起来:
package hellorcp;
2
3import java.util.ArrayList;
4import java.util.Iterator;
5
6import org.eclipse.jface.action.IToolBarManager;
7import org.eclipse.jface.viewers.ISelection;
8import org.eclipse.jface.viewers.ISelectionChangedListener;
9import org.eclipse.jface.viewers.ISelectionProvider;
10import org.eclipse.jface.viewers.IStructuredContentProvider;
11import org.eclipse.jface.viewers.ListViewer;
12import org.eclipse.jface.viewers.SelectionChangedEvent;
13import org.eclipse.swt.SWT;
14import org.eclipse.swt.widgets.Composite;
15import org.eclipse.ui.part.ViewPart;
16import hellorcp.NavigationViewLabelProvider;
17
18
对于detail view ,如果将将消费者视图作为监听器注册到特定的视图部分,就不用循环所有的Listener来通知了,这样可以节约更多的系统资源了。
this.getSite().getPage().addSelectionListener("hellorcp.navigationview",(ISelectionListener)this);
以下是DetailView的另外一种实现:
1package hellorcp;
2
3import java.util.ArrayList;
4
5import org.eclipse.jface.viewers.ISelection;
6import org.eclipse.jface.viewers.IStructuredSelection;
7import org.eclipse.jface.viewers.TableViewer;
8import org.eclipse.swt.SWT;
9import org.eclipse.swt.widgets.Composite;
10import org.eclipse.swt.widgets.Group;
11import org.eclipse.swt.widgets.Label;
12import org.eclipse.swt.widgets.Table;
13import org.eclipse.swt.widgets.Text;
14import org.eclipse.ui.ISelectionListener;
15import org.eclipse.ui.IWorkbenchPart;
16import org.eclipse.ui.part.ViewPart;
17
18
看起来后两种实现是不是比前面的要轻便很多呢?
但是对于我们来讲,视图间以Selection Provider 和Listener模式传递消息还存在很多局限:
1 视图可能希望公布其他信息,而不只是公布可视化选择信息。公布的信息可能是根据选择进行某些后期处理的结果。
2 视图可能希望使用来自另一个插件的信息,而这个插件可能根本没有提供视图(使用包含的 JFace 查看器)。在这种情况下,使用基于 UI 选择的链接是不可能的
对于以上问题,通过自动方式进行就很困难了,需要我们手工解决,而为视图注册属性监听器而实现观测其它视图的属性变化是个不错的替代模式。
(二)属性改变监听器模式:
属性改变监听器模式主要通过使用JFace中一个重要的接口org.eclipse.jface.util.IPropertyChangeListener来实现,通过注册该监听器,以及使用IPropertyChangeEvent,可以达到事件传递的目的。
与Selection provider-listener模式不同的是,属性改变监听器可以定义到插件上,由插件本身提供注册列表,如下所示:
1ArrayList myListeners = new ArrayList();
2 // A public method that allows listener registration
3 // A public method that allows listener registration
8package hellorcp;
2
3import java.util.ArrayList;
4import java.util.Iterator;
5
6import org.eclipse.jface.action.IToolBarManager;
7import org.eclipse.jface.util.IPropertyChangeListener;
8import org.eclipse.jface.viewers.ISelection;
9import org.eclipse.jface.viewers.ISelectionChangedListener;
10import org.eclipse.jface.viewers.ISelectionProvider;
11import org.eclipse.jface.viewers.IStructuredContentProvider;
12import org.eclipse.jface.viewers.IStructuredSelection;
13import org.eclipse.jface.viewers.ListViewer;
14import org.eclipse.jface.viewers.SelectionChangedEvent;
15import org.eclipse.swt.SWT;
16import org.eclipse.swt.widgets.Composite;
17import org.eclipse.ui.part.ViewPart;
18
19import hellorcp.Person;
20import hellorcp.PersonPlugin;
21import hellorcp.NavigationViewLabelProvider;
22
23
注意我们为listviewer添加了Selection Change Listener 方法,并通知到了PersonPlugin。
接着,在detail view中,我们只用实现IPropertyChangeListener即可,以下是detail view的代码:
1package hellorcp;
2
3import java.util.ArrayList;
4
5import org.eclipse.jface.util.IPropertyChangeListener;
6import org.eclipse.jface.viewers.ISelection;
7import org.eclipse.jface.viewers.IStructuredSelection;
8import org.eclipse.jface.viewers.TableViewer;
9import org.eclipse.swt.SWT;
10import org.eclipse.swt.widgets.Composite;
11import org.eclipse.swt.widgets.Group;
12import org.eclipse.swt.widgets.Label;
13import org.eclipse.swt.widgets.Table;
14import org.eclipse.swt.widgets.Text;
15import org.eclipse.ui.ISelectionListener;
16import org.eclipse.ui.IWorkbenchPart;
17import org.eclipse.ui.part.ViewPart;
18
19import hellorcp.PersonPlugin;
20
21import hellorcp.Person;
22
23
采用属性改变监听模式能够更加灵活地在插件之间、插件的各个view之间传递信息,突破了传递信息必须与UI相关的局限,而且还可以异步传递信息,这些信息可以是插件后台JOB定期运行获得的信息,以及定期从数据库中获得的信息等等。不难看到,属性改变监听器扩展了插件之间,视图之间,前台与后台之间的消息传递场景,是我们开发Eclipse RCP应用更好的选择。
首先介绍一下我们要达到的效果,如下图所示:
public class NavigationView extends ViewPart implements ISelectionProvider
以下是ISelectionProvider接口的定义:
1
(2)有了以上步骤还不够,还需要将视图中具体的Viewer上想要发生的事件,注册到这个Provider上。
this.getSite().setSelectionProvider(this);
注意this对象指的是Viwe视图,它具有指向Site的引用,通过getSite()方法获得引用
(4)最后,还要把讲给听众听,没有听众也是白讲,这里是在setSelection()方法里迭代每一个注册了ISelectionListener的控件,找到它们,把事件传递给这些听众即可:
site.getPage().addSelectionListener(this);
然后实现public void selectionChanged(IWorkbenchPart part, ISelection selection) {}方法即可。这样,当SelectionProvider中的选择发生改变时,这个视图中的selectionChanged()方法就会被调用。
即如下方式:
1package hellorcp;
2
3import java.util.ArrayList;
4import java.util.Iterator;
5
6import org.eclipse.jface.action.IToolBarManager;
7import org.eclipse.jface.viewers.ISelection;
8import org.eclipse.jface.viewers.ISelectionChangedListener;
9import org.eclipse.jface.viewers.ISelectionProvider;
10import org.eclipse.jface.viewers.IStructuredContentProvider;
11import org.eclipse.jface.viewers.ListViewer;
12import org.eclipse.jface.viewers.SelectionChangedEvent;
13import org.eclipse.swt.SWT;
14import org.eclipse.swt.widgets.Composite;
15import org.eclipse.ui.part.ViewPart;
16import hellorcp.NavigationViewLabelProvider;
17
18
1package hellorcp;
2
3import java.util.ArrayList;
4
5import org.eclipse.jface.viewers.ISelection;
6import org.eclipse.jface.viewers.IStructuredSelection;
7import org.eclipse.jface.viewers.TableViewer;
8import org.eclipse.swt.SWT;
9import org.eclipse.swt.widgets.Composite;
10import org.eclipse.swt.widgets.Group;
11import org.eclipse.swt.widgets.Label;
12import org.eclipse.swt.widgets.Table;
13import org.eclipse.swt.widgets.Text;
14import org.eclipse.ui.ISelectionListener;
15import org.eclipse.ui.IWorkbenchPart;
16import org.eclipse.ui.part.ViewPart;
17
18
将以上文件重新编译,再运行我们的Hello RCP,可以看到,点击Navigation Views时,已经可以将选择的人员信息传递给detal view了,我们的视图真正动了起来:
package hellorcp;
2
3import java.util.ArrayList;
4import java.util.Iterator;
5
6import org.eclipse.jface.action.IToolBarManager;
7import org.eclipse.jface.viewers.ISelection;
8import org.eclipse.jface.viewers.ISelectionChangedListener;
9import org.eclipse.jface.viewers.ISelectionProvider;
10import org.eclipse.jface.viewers.IStructuredContentProvider;
11import org.eclipse.jface.viewers.ListViewer;
12import org.eclipse.jface.viewers.SelectionChangedEvent;
13import org.eclipse.swt.SWT;
14import org.eclipse.swt.widgets.Composite;
15import org.eclipse.ui.part.ViewPart;
16import hellorcp.NavigationViewLabelProvider;
17
18
对于detail view ,如果将将消费者视图作为监听器注册到特定的视图部分,就不用循环所有的Listener来通知了,这样可以节约更多的系统资源了。
this.getSite().getPage().addSelectionListener("hellorcp.navigationview",(ISelectionListener)this);
以下是DetailView的另外一种实现:
1package hellorcp;
2
3import java.util.ArrayList;
4
5import org.eclipse.jface.viewers.ISelection;
6import org.eclipse.jface.viewers.IStructuredSelection;
7import org.eclipse.jface.viewers.TableViewer;
8import org.eclipse.swt.SWT;
9import org.eclipse.swt.widgets.Composite;
10import org.eclipse.swt.widgets.Group;
11import org.eclipse.swt.widgets.Label;
12import org.eclipse.swt.widgets.Table;
13import org.eclipse.swt.widgets.Text;
14import org.eclipse.ui.ISelectionListener;
15import org.eclipse.ui.IWorkbenchPart;
16import org.eclipse.ui.part.ViewPart;
17
18
看起来后两种实现是不是比前面的要轻便很多呢?
但是对于我们来讲,视图间以Selection Provider 和Listener模式传递消息还存在很多局限:
1 视图可能希望公布其他信息,而不只是公布可视化选择信息。公布的信息可能是根据选择进行某些后期处理的结果。
2 视图可能希望使用来自另一个插件的信息,而这个插件可能根本没有提供视图(使用包含的 JFace 查看器)。在这种情况下,使用基于 UI 选择的链接是不可能的
对于以上问题,通过自动方式进行就很困难了,需要我们手工解决,而为视图注册属性监听器而实现观测其它视图的属性变化是个不错的替代模式。
(二)属性改变监听器模式:
属性改变监听器模式主要通过使用JFace中一个重要的接口org.eclipse.jface.util.IPropertyChangeListener来实现,通过注册该监听器,以及使用IPropertyChangeEvent,可以达到事件传递的目的。
与Selection provider-listener模式不同的是,属性改变监听器可以定义到插件上,由插件本身提供注册列表,如下所示:
1ArrayList myListeners = new ArrayList();
2 // A public method that allows listener registration
3 // A public method that allows listener registration
8package hellorcp;
2
3import java.util.ArrayList;
4import java.util.Iterator;
5
6import org.eclipse.jface.action.IToolBarManager;
7import org.eclipse.jface.util.IPropertyChangeListener;
8import org.eclipse.jface.viewers.ISelection;
9import org.eclipse.jface.viewers.ISelectionChangedListener;
10import org.eclipse.jface.viewers.ISelectionProvider;
11import org.eclipse.jface.viewers.IStructuredContentProvider;
12import org.eclipse.jface.viewers.IStructuredSelection;
13import org.eclipse.jface.viewers.ListViewer;
14import org.eclipse.jface.viewers.SelectionChangedEvent;
15import org.eclipse.swt.SWT;
16import org.eclipse.swt.widgets.Composite;
17import org.eclipse.ui.part.ViewPart;
18
19import hellorcp.Person;
20import hellorcp.PersonPlugin;
21import hellorcp.NavigationViewLabelProvider;
22
23
注意我们为listviewer添加了Selection Change Listener 方法,并通知到了PersonPlugin。
接着,在detail view中,我们只用实现IPropertyChangeListener即可,以下是detail view的代码:
1package hellorcp;
2
3import java.util.ArrayList;
4
5import org.eclipse.jface.util.IPropertyChangeListener;
6import org.eclipse.jface.viewers.ISelection;
7import org.eclipse.jface.viewers.IStructuredSelection;
8import org.eclipse.jface.viewers.TableViewer;
9import org.eclipse.swt.SWT;
10import org.eclipse.swt.widgets.Composite;
11import org.eclipse.swt.widgets.Group;
12import org.eclipse.swt.widgets.Label;
13import org.eclipse.swt.widgets.Table;
14import org.eclipse.swt.widgets.Text;
15import org.eclipse.ui.ISelectionListener;
16import org.eclipse.ui.IWorkbenchPart;
17import org.eclipse.ui.part.ViewPart;
18
19import hellorcp.PersonPlugin;
20
21import hellorcp.Person;
22
23
采用属性改变监听模式能够更加灵活地在插件之间、插件的各个view之间传递信息,突破了传递信息必须与UI相关的局限,而且还可以异步传递信息,这些信息可以是插件后台JOB定期运行获得的信息,以及定期从数据库中获得的信息等等。不难看到,属性改变监听器扩展了插件之间,视图之间,前台与后台之间的消息传递场景,是我们开发Eclipse RCP应用更好的选择。
相关文章推荐
- 使用Eclipse RCP创建视图并实现视图间消息传递(二)
- 使用Eclipse RCP创建视图并实现视图间消息传递
- 使用Eclipse RCP创建视图并实现视图间消息传递
- 使用Eclipse 创建视图并实现视图间消息传递
- MFC小程序003------MFC使用WebBrowser组件,在对话框中创建滚动视图,动态创建一个静态文本控件并设置鼠标单击的消息响应
- C++--如何实现SDI程序使用CSplitterWnd创建的多个视图的动态地显示和关闭视图
- C++--如何实现SDI程序使用CSplitterWnd创建的多个视图的动态地显示和关闭视图
- C++--如何实现SDI程序使用CSplitterWnd创建的多个视图的动态地显示和关闭视图
- 如何实现SDI程序使用CSplitterWnd创建的多个视图的动态地显示和关闭视图
- C++--如何实现SDI程序使用CSplitterWnd创建的多个视图的动态地显示和关闭视图
- 使用notification广播实现视图跳转传递数据
- 使用protobuf和socket实现服务器间消息的传递
- 使用autolayout的NSLayoutConstraint类中的constraintWithItem 、constraintsWithVisualFormat这两个类方法来创建视图并可以实现自动布局
- 使用Bandle 实现 Android Activity间消息的传递
- 使用Spring JMS轻松实现异步消息传递
- 【Phalcon实现高性能网站】使用Phalcon高性能PHP框架搭建网站 视图之传递参数
- 使用Handler实现主线程与子线程之间互相传递消息
- 使用Spring JMS轻松实现异步消息传递
- 使用“消息服务框架”(MSF)实现分布式事务的三阶段提交协议(电商创建订单的示例)
- delphi使用消息传递字符串有三种方式可以实现