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

RCP开发,view事件通知机制

 
阅读更多

最近遇到了RCP的view之间的信息传递的问题,看了一下,觉得这篇介绍的还不错,转一下

引用:http://blog.csdn.net/xueyepiaoling/article/details/6737048

在上一文中,我们介绍了怎样创建一个Eclipse RCP,并创建用户交互的视图,但是并没有提到如何实现视图的交互。在本文中,我们会介绍以两种不同的方式实现Eclipse RCP View之间的交互,并结合代码详细领略一下Eclipse是如何巧妙处理View之间交互的。
首先介绍一下我们要达到的效果,如下图所示:

可以看到,用户点击左边视图上的人员列表,该人员的详细信息会显示在右侧的view视图中,这一步骤看起来简单,但是要做的工作却不少,下面我们就着手把前期获得的RCP程序做成这个样子,让View之间传递信息或者更复杂一些的对象。

从Eclipse目前提供的手段看来,我们可以使用下列方法实现视图的交互:
(1)选择提供器 - 选择监听器(selection provider-selection listener)模式,从而让视图对其他视图中的选择做出反应
(2)使用属性改变监听模式,即Property Changed Listener模式,用于视图中没有可供点击的UI模块的情况下。这类监听模式允许视图将属性改变事件

以下将详细介绍这两种模式的概念、适用场景,并结合我们的Hello RCP分别实例说明这两种视图交互模式的实现。
(一)选择提供器-选择监听器(selection provider-selection listener)模式:
这是一种传统的事件传递模式,一般来说,只要视图中的UI控件实现了ISelectionProvider接口,即具备提供选 择事件的能力,就可以使用这个模式将自身发生的选择事件提供给其他实现了ISelectionListener的UI控件。例如我们在Hello RCP中实现的Navigation视图,里面采用了ListViewer这一控件,而Jface中所有的Viewer对象都实现了 ISelectionProvider接口,那么当我们点击navigation视图list列表中的人员名单时,ListViewer列表就可以向其他 能够监听该选择事件的对象提供该选择事件,如果我们在事件中包含一些字符串信息,那么其他对象得到这个信息之后,就可以进行相应显示了。
“Eclipse提供了所谓的Site,以及ISelectionService机制,来处理试图之间的简单的交互。简单的说,ViewSite提供了一个交互的中心点,其它ViewViewSite提供选择事件,或者向其注册监听器,而事件的触发与转发则由ViewSite()来完成。”
以上只是一些概念介绍,对于我们来说,只需按照下列步骤进行,就可以将一个视图变成一个提供Selection 事件的Selection Provider:
(1)首先将视图注册成为Selection Provider,即实现ISelectionProvider接口

publicclassNavigationViewextendsViewPartimplementsISelectionProvider
以下是ISelectionProvider接口的定义:
1publicinterfaceISelectionProvider{
2
3publicvoidaddSelectionChangedListener(ISelectionChangedListenerlistener);
4
5publicISelectiongetSelection();
6
7publicvoidremoveSelectionChangedListener(
8
9ISelectionChangedListenerlistener);
10
11publicvoidsetSelection(ISelectionselection);
12
13}

14
(2)有了以上步骤还不够,还需要将视图中具体的Viewer上想要发生的事件,注册到这个Provider上。
viewer.addSelectionChangedListener(newISelectionChangedListener(){
publicvoidselectionChanged(SelectionChangedEventevent){
ISelectionselection2
=event.getSelection();
setSelection(selection2);
}

}
);
这段代码就是把ListViewer上的Selection ChangeEvent注册到了Selection Provider上,由后者负责向外传播
(3)一个Selection Provider想要其他部件监听的话,还要向Site中控台进行注册,要不然就相当于开会时找不到话筒讲话,大家听不见
1this.getSite().setSelectionProvider(this);

注意this对象指的是Viwe视图,它具有指向Site的引用,通过getSite()方法获得引用
(4)最后,还要把讲给听众听,没有听众也是白讲,这里是在setSelection()方法里迭代每一个注册了ISelectionListener的控件,找到它们,把事件传递给这些听众即可:

publicvoidsetSelection(ISelectionselection){
this.selection=selection;
SelectionChangedEventevent2
=newSelectionChangedEvent(viewer,selection);
for(Iteratori=myListeners.iterator();i.hasNext();){
ISelectionChangedListenerobject
=(ISelectionChangedListener)i.next();
object.selectionChanged(event2);
}


}


至此,我们已经实现了一个Selection Provider了,对于事件监听的另一端,即Selection Listener,则更为简单一些。只需要实现ISelectionListener接口,并注册在Site中:

site.getPage().addSelectionListener(this);

然后实现public void selectionChanged(IWorkbenchPart part, ISelection selection) {}方法即可。这样,当SelectionProvider中的选择发生改变时,这个视图中的selectionChanged()方法就会被调用。

即如下方式:

1publicvoidselectionChanged(IWorkbenchPartpart,ISelectionselection){
2IStructuredSelectionstructuredSelection=(IStructuredSelection)selection;
3Objectobj=structuredSelection.getFirstElement();
4PersontempPerson=(Person)obj;
5if(tempPerson!=null)
6text.setText(tempPerson.getName());
7text_1.setText(tempPerson.getSex());
8}


根据以上介绍的Selection Provider-Selection Listener模式,我们重新改造了一下navigation view视图和detail view视图:

1packagehellorcp;
2
3importjava.util.ArrayList;
4importjava.util.Iterator;
5
6importorg.eclipse.jface.action.IToolBarManager;
7importorg.eclipse.jface.viewers.ISelection;
8importorg.eclipse.jface.viewers.ISelectionChangedListener;
9importorg.eclipse.jface.viewers.ISelectionProvider;
10importorg.eclipse.jface.viewers.IStructuredContentProvider;
11importorg.eclipse.jface.viewers.ListViewer;
12importorg.eclipse.jface.viewers.SelectionChangedEvent;
13importorg.eclipse.swt.SWT;
14importorg.eclipse.swt.widgets.Composite;
15importorg.eclipse.ui.part.ViewPart;
16importhellorcp.NavigationViewLabelProvider;
17
18publicclassNavigationViewPartextendsViewPartimplementsISelectionProvider{
19
20privateISelectionselection;
21ArrayListmyListeners=newArrayList();
22ListViewerlistViewer;
23
24publicNavigationViewPart(){
25//TODOAuto-generatedconstructorstub
26}

27
28@Override
29publicvoidcreatePartControl(Compositeparent){
30listViewer=newListViewer(parent,SWT.BORDER);
31listViewer.setLabelProvider(newNavigationViewLabelProvider());
32listViewer.setContentProvider(newNavigationListViewContentProvider());
33listViewer.setInput(newPersonModel());
34initializeToolBar();
35listViewer.addSelectionChangedListener(newISelectionChangedListener(){
36publicvoidselectionChanged(SelectionChangedEventevent){
37ISelectionselection2=event.getSelection();
38setSelection(selection2);
39}

40}
);
41this.getSite().setSelectionProvider(this);
42//TODOAuto-generatedmethodstub
43
44}

45
46publicISelectiongetSelection(){
47//TODOAuto-generatedmethodstub
48returnnull;
49}

50
51publicvoidaddSelectionChangedListener(ISelectionChangedListenerlistener){
52if(!myListeners.contains(listener))
53myListeners.add(listener);
54}

55
56publicvoidremoveSelectionChangedListener(ISelectionChangedListenerlistener){
57myListeners.remove(listener);
58}

59
60@Override
61publicvoidsetFocus(){
62//TODOAuto-generatedmethodstub
63
64}

65privatevoidinitializeToolBar(){
66IToolBarManagertoolBarManager=getViewSite().getActionBars().getToolBarManager();
67}

68publicvoidsetSelection(ISelectionselection){
69this.selection=selection;
70SelectionChangedEventevent2=newSelectionChangedEvent(listViewer,selection);
71for(Iteratori=myListeners.iterator();i.hasNext();){
72ISelectionChangedListenerobject=(ISelectionChangedListener)i.next();
73object.selectionChanged(event2);
74}

75
76}

77
78}

79

1packagehellorcp;
2
3importjava.util.ArrayList;
4
5importorg.eclipse.jface.viewers.ISelection;
6importorg.eclipse.jface.viewers.IStructuredSelection;
7importorg.eclipse.jface.viewers.TableViewer;
8importorg.eclipse.swt.SWT;
9importorg.eclipse.swt.widgets.Composite;
10importorg.eclipse.swt.widgets.Group;
11importorg.eclipse.swt.widgets.Label;
12importorg.eclipse.swt.widgets.Table;
13importorg.eclipse.swt.widgets.Text;
14importorg.eclipse.ui.ISelectionListener;
15importorg.eclipse.ui.IWorkbenchPart;
16importorg.eclipse.ui.part.ViewPart;
17
18publicclassDetailViewextendsViewPartimplementsISelectionListener{
19
20privateTabletable;
21privateTexttext_1;
22privateTexttext;
23@SuppressWarnings("unchecked")
24ArrayListmyListeners;
25publicDetailView(){
26super();
27//TODOAuto-generatedconstructorstub
28}

29
30@Override
31publicvoidcreatePartControl(Compositeparent){
32finalCompositecomposite=newComposite(parent,SWT.NONE);
33
34finalGroupgroup=newGroup(composite,SWT.NONE);
35group.setBounds(0,0,494,62);
36
37finalLabellabel=newLabel(group,SWT.NONE);
38label.setText("姓名");
39label.setBounds(10,32,24,12);
40
41text=newText(group,SWT.BORDER);
42text.setBounds(40,29,80,15);
43
44finalLabellabel_1=newLabel(group,SWT.NONE);
45label_1.setText("性别");
46label_1.setBounds(172,32,30,12);
47
48text_1=newText(group,SWT.BORDER);
49text_1.setBounds(208,29,80,15);
50
51finalTableViewertableViewer=newTableViewer(composite,SWT.BORDER);
52table=tableViewer.getTable();
53table.setLinesVisible(true);
54table.setHeaderVisible(true);
55table.setBounds(0,68,494,270);
56initializeToolBar();
57this.getSite().getPage().addSelectionListener(this);
58}

59
60@Override
61publicvoidsetFocus(){
62//TODOAuto-generatedmethodstub
63
64}

65privatevoidinitializeToolBar(){
66}

67
68publicvoidselectionChanged(IWorkbenchPartpart,ISelectionselection){
69IStructuredSelectionstructuredSelection=(IStructuredSelection)selection;
70Objectobj=structuredSelection.getFirstElement();
71PersontempPerson=(Person)obj;
72if(tempPerson!=null)
73text.setText(tempPerson.getName());
74text_1.setText(tempPerson.getSex());
75
76}

77
78}

79


将以上文件重新编译,再运行我们的Hello RCP,可以看到,点击Navigation Views时,已经可以将选择的人员信息传递给detal view了,我们的视图真正动了起来:


其实对于本例来说,由于JFace Viewer已经实现了ISelectionProvider 接口,因此还有一种更简便的方法实现上述效果,就是将navigation view中的list viewer直接注册为Selection Provider ,这样就可以省去实现ISelectionProvider接口的代码了:
以下是NavigationViewPart.java的另外一种实现方式:

1packagehellorcp;
2
3importjava.util.ArrayList;
4importjava.util.Iterator;
5
6importorg.eclipse.jface.action.IToolBarManager;
7importorg.eclipse.jface.viewers.ISelection;
8importorg.eclipse.jface.viewers.ISelectionChangedListener;
9importorg.eclipse.jface.viewers.ISelectionProvider;
10importorg.eclipse.jface.viewers.IStructuredContentProvider;
11importorg.eclipse.jface.viewers.ListViewer;
12importorg.eclipse.jface.viewers.SelectionChangedEvent;
13importorg.eclipse.swt.SWT;
14importorg.eclipse.swt.widgets.Composite;
15importorg.eclipse.ui.part.ViewPart;
16importhellorcp.NavigationViewLabelProvider;
17
18publicclassNavigationViewPartextendsViewPart{
19
20privateISelectionselection;
21ArrayListmyListeners=newArrayList();
22ListViewerlistViewer;
23
24publicNavigationViewPart(){
25//TODOAuto-generatedconstructorstub
26}

27
28@Override
29publicvoidcreatePartControl(Compositeparent){
30listViewer=newListViewer(parent,SWT.BORDER);
31listViewer.setLabelProvider(newNavigationViewLabelProvider());
32listViewer.setContentProvider(newNavigationListViewContentProvider());
33listViewer.setInput(newPersonModel());
34this.getSite().setSelectionProvider(listViewer);
35//TODOAuto-generatedmethodstub
36
37}

38@Override
39publicvoidsetFocus(){
40//TODOAuto-generatedmethodstub
41
42}

43
44}

45

对于detail view ,如果将将消费者视图作为监听器注册到特定的视图部分,就不用循环所有的Listener来通知了,这样可以节约更多的系统资源了。

this.getSite().getPage().addSelectionListener("hellorcp.navigationview",(ISelectionListener)this);

以下是DetailView的另外一种实现:

1packagehellorcp;
2
3importjava.util.ArrayList;
4
5importorg.eclipse.jface.viewers.ISelection;
6importorg.eclipse.jface.viewers.IStructuredSelection;
7importorg.eclipse.jface.viewers.TableViewer;
8importorg.eclipse.swt.SWT;
9importorg.eclipse.swt.widgets.Composite;
10importorg.eclipse.swt.widgets.Group;
11importorg.eclipse.swt.widgets.Label;
12importorg.eclipse.swt.widgets.Table;
13importorg.eclipse.swt.widgets.Text;
14importorg.eclipse.ui.ISelectionListener;
15importorg.eclipse.ui.IWorkbenchPart;
16importorg.eclipse.ui.part.ViewPart;
17
18publicclassDetailViewextendsViewPartimplementsISelectionListener{
19
20privateTabletable;
21privateTexttext_1;
22privateTexttext;
23@SuppressWarnings("unchecked")
24ArrayListmyListeners;
25publicDetailView(){
26super();
27//TODOAuto-generatedconstructorstub
28}

29
30@Override
31publicvoidcreatePartControl(Compositeparent){
32finalCompositecomposite=newComposite(parent,SWT.NONE);
33
34finalGroupgroup=newGroup(composite,SWT.NONE);
35group.setBounds(0,0,494,62);
36
37finalLabellabel=newLabel(group,SWT.NONE);
38label.setText("姓名");
39label.setBounds(10,32,24,12);
40
41text=newText(group,SWT.BORDER);
42text.setBounds(40,29,80,15);
43
44finalLabellabel_1=newLabel(group,SWT.NONE);
45label_1.setText("性别");
46label_1.setBounds(172,32,30,12);
47
48text_1=newText(group,SWT.BORDER);
49text_1.setBounds(208,29,80,15);
50
51finalTableViewertableViewer=newTableViewer(composite,SWT.BORDER);
52table=tableViewer.getTable();
53table.setLinesVisible(true);
54table.setHeaderVisible(true);
55table.setBounds(0,68,494,270);
56initializeToolBar();
57this.getSite().getPage().addSelectionListener("hellorcp.navigationview",(ISelectionListener)this);
58
59}

60
61@Override
62publicvoidsetFocus(){
63//TODOAuto-generatedmethodstub
64
65}

66privatevoidinitializeToolBar(){
67}

68
69publicvoidselectionChanged(IWorkbenchPartpart,ISelectionselection){
70IStructuredSelectionstructuredSelection=(IStructuredSelection)selection;
71Objectobj=structuredSelection.getFirstElement();
72PersontempPerson=(Person)obj;
73if(tempPerson!=null)
74text.setText(tempPerson.getName());
75text_1.setText(tempPerson.getSex());
76
77}

78
79}

80

看起来后两种实现是不是比前面的要轻便很多呢?
但是对于我们来讲,视图间以Selection Provider 和Listener模式传递消息还存在很多局限:
1视图可能希望公布其他信息,而不只是公布可视化选择信息。公布的信息可能是根据选择进行某些后期处理的结果。
2 视图可能希望使用来自另一个插件的信息,而这个插件可能根本没有提供视图(使用包含的 JFace 查看器)。在这种情况下,使用基于 UI 选择的链接是不可能的
对于以上问题,通过自动方式进行就很困难了,需要我们手工解决,而为视图注册属性监听器而实现观测其它视图的属性变化是个不错的替代模式。

(二)属性改变监听器模式:
属性改变监听器模式主要通过使用JFace中一个重要的接口org.eclipse.jface.util.IPropertyChangeListener来实现,通过注册该监听器,以及使用IPropertyChangeEvent,可以达到事件传递的目的。
与Selection provider-listener模式不同的是,属性改变监听器可以定义到插件上,由插件本身提供注册列表,如下所示:

1ArrayListmyListeners=newArrayList();
2//Apublicmethodthatallowslistenerregistration
3publicvoidaddPropertyChangeListener(IPropertyChangeListenerlistener){
4if(!myListeners.contains(listener))
5myListeners.add(listener);
6}

7//Apublicmethodthatallowslistenerregistration
8publicvoidremovePropertyChangeListener(IPropertyChangeListenerlistener){
9myListeners.remove(listener);
10}


当插件想要把产生的事件通知到各个监听器的时候,就对这个注册列表中每个Listener元素进行迭代,逐一通知,这样每个Property Change Event就传播到了各个Listener,由后者进行处理了,这个调用模式如下所示:

1publicvoidinitAndInvoke(ArrayListlisteners,Objectobj){
2//PostInvocation,informlisteners
3for(Iterator<IPropertyChangeListener>iter=myListeners.iterator();iter.hasNext();){
4IPropertyChangeListenerelement=(IPropertyChangeListener)iter.next();
5element.propertyChange(newPropertyChangeEvent(this,"HelloRcpEvent",null,obj));
6
7}

8}


总而言之,要想实现这个模式,我们必须自己新定义一个注册并调用Property Change Event的类,我们把它叫做:PersonPlugin.java

那么接下来对于我们的navigation view中的list来说,由于没有采用provider模式,那么就必须自己定义它的SelectionChangeListener了,我们可以在这个ListViewer的添加该Listener中实现我们的目的:

1packagehellorcp;
2
3importjava.util.ArrayList;
4importjava.util.Iterator;
5
6importorg.eclipse.jface.action.IToolBarManager;
7importorg.eclipse.jface.util.IPropertyChangeListener;
8importorg.eclipse.jface.viewers.ISelection;
9importorg.eclipse.jface.viewers.ISelectionChangedListener;
10importorg.eclipse.jface.viewers.ISelectionProvider;
11importorg.eclipse.jface.viewers.IStructuredContentProvider;
12importorg.eclipse.jface.viewers.IStructuredSelection;
13importorg.eclipse.jface.viewers.ListViewer;
14importorg.eclipse.jface.viewers.SelectionChangedEvent;
15importorg.eclipse.swt.SWT;
16importorg.eclipse.swt.widgets.Composite;
17importorg.eclipse.ui.part.ViewPart;
18
19importhellorcp.Person;
20importhellorcp.PersonPlugin;
21importhellorcp.NavigationViewLabelProvider;
22
23publicclassNavigationViewPartextendsViewPart{
24
25privateISelectionselection;
26ArrayListmyListeners=newArrayList();
27ListViewerlistViewer;
28
29publicNavigationViewPart(){
30//TODOAuto-generatedconstructorstub
31}

32
33@Override
34publicvoidcreatePartControl(Compositeparent){
35listViewer=newListViewer(parent,SWT.BORDER);
36listViewer.setLabelProvider(newNavigationViewLabelProvider());
37listViewer.setContentProvider(newNavigationListViewContentProvider());
38listViewer.setInput(newPersonModel());
39//this.getSite().setSelectionProvider(listViewer);
40listViewer.addSelectionChangedListener(newISelectionChangedListener(){
41publicvoidselectionChanged(SelectionChangedEventevent){
42ISelectionselection2=event.getSelection();
43setSelection(selection2);
44//PostInvocation,informlisteners
45IStructuredSelectionstructuredSelection=(IStructuredSelection)selection;
46Objectobj=structuredSelection.getFirstElement();
47PersontempPerson=(Person)obj;
48PersonPlugin.getInstance().initAndInvoke(myListeners,tempPerson);
49}

50}
);
51//TODOAuto-generatedmethodstub
52
53}

54
55publicISelectiongetSelection(){
56//TODOAuto-generatedmethodstub
57returnnull;
58}

59
60//Apublicmethodthatallowslistenerregistration
61publicvoidaddPropertyChangeListener(IPropertyChangeListenerlistener){
62if(!myListeners.contains(listener))
63myListeners.add(listener);
64}

65
66//Apublicmethodthatallowslistenerregistration
67publicvoidremovePropertyChangeListener(IPropertyChangeListenerlistener){
68myListeners.remove(listener);
69}

70
71@Override
72publicvoidsetFocus(){
73//TODOAuto-generatedmethodstub
74
75}

76publicvoidsetSelection(ISelectionselection){
77this.selection=selection;
78}

79}

80


注意我们为listviewer添加了Selection Change Listener 方法,并通知到了PersonPlugin。

接着,在detail view中,我们只用实现IPropertyChangeListener即可,以下是detail view的代码:

1packagehellorcp;
2
3importjava.util.ArrayList;
4
5importorg.eclipse.jface.util.IPropertyChangeListener;
6importorg.eclipse.jface.viewers.ISelection;
7importorg.eclipse.jface.viewers.IStructuredSelection;
8importorg.eclipse.jface.viewers.TableViewer;
9importorg.eclipse.swt.SWT;
10importorg.eclipse.swt.widgets.Composite;
11importorg.eclipse.swt.widgets.Group;
12importorg.eclipse.swt.widgets.Label;
13importorg.eclipse.swt.widgets.Table;
14importorg.eclipse.swt.widgets.Text;
15importorg.eclipse.ui.ISelectionListener;
16importorg.eclipse.ui.IWorkbenchPart;
17importorg.eclipse.ui.part.ViewPart;
18
19importhellorcp.PersonPlugin;
20
21importhellorcp.Person;
22
23publicclassDetailViewextendsViewPartimplementsIPropertyChangeListener{
24
25privateTabletable;
26privateTexttext_1;
27privateTexttext;
28@SuppressWarnings("unchecked")
29ArrayListmyListeners;
30publicDetailView(){
31super();
32//TODOAuto-generatedconstructorstub
33}

34
35@Override
36publicvoidcreatePartControl(Compositeparent){
37finalCompositecomposite=newComposite(parent,SWT.NONE);
38
39finalGroupgroup=newGroup(composite,SWT.NONE);
40group.setBounds(0,0,494,62);
41
42finalLabellabel=newLabel(group,SWT.NONE);
43label.setText("姓名");
44label.setBounds(10,32,24,12);
45
46text=newText(group,SWT.BORDER);
47text.setBounds(40,29,80,15);
48
49finalLabellabel_1=newLabel(group,SWT.NONE);
50label_1.setText("性别");
51label_1.setBounds(172,32,30,12);
52
53text_1=newText(group,SWT.BORDER);
54text_1.setBounds(208,29,80,15);
55
56finalTableViewertableViewer=newTableViewer(composite,SWT.BORDER);
57table=tableViewer.getTable();
58table.setLinesVisible(true);
59table.setHeaderVisible(true);
60table.setBounds(0,68,494,270);
61initializeToolBar();
62//注册事件
63PersonPlugin.getInstance().addPropertyChangeListener(this);
64
65}

66
67@Override
68publicvoidsetFocus(){
69//TODOAuto-generatedmethodstub
70
71}

72privatevoidinitializeToolBar(){
73}

74
75//publicvoidselectionChanged(IWorkbenchPartpart,ISelectionselection){
76//IStructuredSelectionstructuredSelection=(IStructuredSelection)selection;
77//Objectobj=structuredSelection.getFirstElement();
78//PersontempPerson=(Person)obj;
79//if(tempPerson!=null)
80//text.setText(tempPerson.getName());
81//text_1.setText(tempPerson.getSex());
82//
83//}
84publicvoidpropertyChange(org.eclipse.jface.util.PropertyChangeEventevent){
85if(event.getProperty().equals("HelloRcpEvent")){
86Objectval=event.getNewValue();
87PersontempPerson=(Person)val;
88if(tempPerson!=null){
89text.setText(tempPerson.getName());
90text_1.setText(tempPerson.getSex());
91}

92}

93
94}

95
96}

97

采用属性改变监听模式能够更加灵活地在插件之间、插件的各个view之间传递信息,突破了传递信息必须与UI相关的局限,而且还可以异步传递信息,这些信 息可以是插件后台JOB定期运行获得的信息,以及定期从数据库中获得的信息等等。不难看到,属性改变监听器扩展了插件之间,视图之间,前台与后台之间的消 息传递场景,是我们开发Eclipse RCP应用更好的选择。


分享到:
评论

相关推荐

    RCP,RCP开发

    RCP&OSGI;

    Eclipse RCP开发教程

    Eclipse RCP开发教程,RCP入门教程,教你如何使用SWT Eclipse RCP开发教程,RCP入门教程,教你如何使用SWT Eclipse RCP开发教程,RCP入门教程,教你如何使用SWT Eclipse RCP开发教程,RCP入门教程,教你如何使用SWT

    Eclipse RCP 开发资料

    Eclipse RCP 开发资料打包下载 目录如下: RCP程序设计.pdf(推荐) Addison.Wesley.Eclipse.Rich.Client.Platform.Designing.Coding.and.Packaging.Java.Applications.Oct.2005.chm Eclipse+RCP入门.pdf example_...

    通过例子学习EclipseRCP开发

    通过例子学习EclipseRCP开发通过例子学习EclipseRCP开发

    RCP开发书籍资料简介

    转载的他人的资料 希望对大家有用 RCP开发书籍资料简介 插件开发 - 中国Eclipse社区

    eclipse rcp开发入六教程及培训资料

    网络中最全面最合适学习或开发...包含eclipse rcp开发入门教程; eclipse rcp基础教程;eclipse rcp开发自学教程; eclipse rcp开发培训教程及ppt等相关资料;教程中包含一步步操作实例,包含对开发原理的讲解与说明;

    RCP 开发自学教程

    RCP Plug-in开发自学教程.pdf

    eclipse 3.6 rcp 开发

    Eclipse RCP允许开发者使用eclipse结构风格设计弹性的可扩展的应用程序,可重用Eclipse中已存在的方法和编码模式。俗话说,万事开头难。Eclipse RCP入手可能会比较困难、费时。接下来我们将主要讲述如何让RCP工作. ...

    rcp 开发自学教程

    rcp 开发自学教程,eclipse插件开发,是个很不错的入门教程

    eclipse rcp 开发基础教程

    eclipse rcp 开发基础教程 入门级别

    RCP开发入门-PDF.7z

    eclipse RCP 开发很棒的PDF书籍。开源于网络,供大家学习

    eclipse rcp 开发实例 (源码下载)

    前一段时间学习eclipse rcp开发写的一个学习用的工程。涉及了我当时学到的一些方面。 当时想找一个可以用来学习的简单的源代码真难,有的都是复杂的。 这里提供一个简单的工程。设计初学者接触的各种问题。有时通一...

    RCP 开发实例 源码

    RCP 开发实例,纯界面,没有连接数据库

    rcp 开发档案管理系统

    rcp开发档案管理系统,登陆admin/123,需要复制数据库文件到e盘的file目录下。

    Eclipse的RCP开发的入门教程

    学习Eclipse RCP开发的一个教程。word文件格式的。本人从IBM官方网站上下载的。在这里打个包一起发给大家,方便学习!

    RCP开发指南

    RCP开发指南,对于初学者有所帮助,可以少走弯路

    基于SWt,JFace的Rcp 开发实例

    一个介绍RCp开发的实例项目,包含了SWt,JFace组件 的用法,特别适用于初学者

    Eclipse RCP应用系统开发方法与实战

    Eclipse RCP应用系统开发方法与实战 Eclipse RCP应用系统开发方法与实战 Eclipse RCP应用系统开发方法与实战

    Eclipse RCP开发详解

    eclipse rcp开发插件详解,快速开发eclipse插件,资源很好

Global site tag (gtag.js) - Google Analytics