您的位置:首页 > 编程语言 > Java开发

使用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应用更好的选择。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐